Laravel/Lumen - 使用 Model::with()
Laravel/Lumen - Using Model::with()
我有两个 table:
核心 table 和 extensiontable_itc。
它们是 1-n 关系,extensiontable_itc 可以有 N 条记录引用 coretable.
上的 1 条记录
如果没理解错的话,我学到这里
model::with('relatedModel')->get()
可以从 coretable 和 extensiontable_itc 获取所有记录,只要 coretable 记录被 extensiontable_itc 记录引用。
但是,当我将它应用到我的代码时,如下所示:
$join = coretable::with('extensiontable_itc')->get();
log::info($join);
我收到以下错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'extensiontable_itc.extensiontable_itc' in 'where clause' (SQL: select * from `extensiontable_itc` where `extensiontable_itc`.`extensiontable_itc` in (1))
据我了解,它在我的 extensiontable_itc table 上寻找 "extensiontable_itc" 列。这当然行不通,但我不明白为什么会这样?
外键在我的数据库中就位,相应的模型应该没问题,这是它们的代码:
coretable.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CoreTable extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'coretable';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'Internal_key'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function extensiontable_itc()
{
return $this->hasOne('App\extensiontable_itc', 'extensiontable_itc');
}
public function inaccessibletable()
{
return $this->hasOne('App\inaccessibletable', 'inaccessibletable');
}
}
extensiontable_itc.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class extensiontable_itc extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'extensiontable_itc';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'description'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function coretable()
{
return $this->hasOne('App\coretable', 'coretable');
}
}
下面是我的数据库中外键的概述:
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| ad_usersxad_groups | Ad_user_id | fk_ad_groupxad_user | ad_users | id |
| ad_usersxad_groups | Ad_group_id | fk_ad_userxad_group | ad_groups | id |
| extensiontables_registryxad_groups | ad_group_id | fk_ad_groupxextensiontables_registry | ad_groups | id |
| extensiontables_registryxad_groups | extensiontables_registry_id | fk_extensiontables_registryxad_group | extensiontables_registry | id |
| extensiontable_itc | coretable_id | fk_extensiontable_itc_coretable | coretable | id |
| inaccessibletable | coretable_id | fk_inaccessibletable_coretable | coretable | id |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
return $this->hasOne('App\ModelName', 'foreign_key', 'local_key');
出现问题是因为当您使用with('extensiontable_itc')
;
laravel根据你的关系方式extensiontable_itc
找到foreign_key,而你给的是extensiontable_itc
,而你没有这一栏,
在 hasOne 方法中将 extensiontable_itc
更改为 coretable_id
:
public function extensiontable_itc()
{
return $this->hasOne('App\extensiontable_itc', 'coretable_id');
}
和coretable
有一个extensiontable_itc
,extensiontable_itc
属于coretable
,需要用belongsTo方法细化一个hasOne的逆关系:
public function coretable()
{
return $this->belongsTo('App\coretable', 'coretable_id');
}
更多参考:one-to-one
我有两个 table: 核心 table 和 extensiontable_itc。 它们是 1-n 关系,extensiontable_itc 可以有 N 条记录引用 coretable.
上的 1 条记录如果没理解错的话,我学到这里
model::with('relatedModel')->get()
可以从 coretable 和 extensiontable_itc 获取所有记录,只要 coretable 记录被 extensiontable_itc 记录引用。
但是,当我将它应用到我的代码时,如下所示:
$join = coretable::with('extensiontable_itc')->get();
log::info($join);
我收到以下错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'extensiontable_itc.extensiontable_itc' in 'where clause' (SQL: select * from `extensiontable_itc` where `extensiontable_itc`.`extensiontable_itc` in (1))
据我了解,它在我的 extensiontable_itc table 上寻找 "extensiontable_itc" 列。这当然行不通,但我不明白为什么会这样? 外键在我的数据库中就位,相应的模型应该没问题,这是它们的代码:
coretable.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CoreTable extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'coretable';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'Internal_key'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function extensiontable_itc()
{
return $this->hasOne('App\extensiontable_itc', 'extensiontable_itc');
}
public function inaccessibletable()
{
return $this->hasOne('App\inaccessibletable', 'inaccessibletable');
}
}
extensiontable_itc.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class extensiontable_itc extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'extensiontable_itc';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'description'
];
/**
* Many-To-Many relationship with User-Model.
*/
public function coretable()
{
return $this->hasOne('App\coretable', 'coretable');
}
}
下面是我的数据库中外键的概述:
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| ad_usersxad_groups | Ad_user_id | fk_ad_groupxad_user | ad_users | id |
| ad_usersxad_groups | Ad_group_id | fk_ad_userxad_group | ad_groups | id |
| extensiontables_registryxad_groups | ad_group_id | fk_ad_groupxextensiontables_registry | ad_groups | id |
| extensiontables_registryxad_groups | extensiontables_registry_id | fk_extensiontables_registryxad_group | extensiontables_registry | id |
| extensiontable_itc | coretable_id | fk_extensiontable_itc_coretable | coretable | id |
| inaccessibletable | coretable_id | fk_inaccessibletable_coretable | coretable | id |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
return $this->hasOne('App\ModelName', 'foreign_key', 'local_key');
出现问题是因为当您使用with('extensiontable_itc')
;
laravel根据你的关系方式extensiontable_itc
找到foreign_key,而你给的是extensiontable_itc
,而你没有这一栏,
在 hasOne 方法中将 extensiontable_itc
更改为 coretable_id
:
public function extensiontable_itc()
{
return $this->hasOne('App\extensiontable_itc', 'coretable_id');
}
和coretable
有一个extensiontable_itc
,extensiontable_itc
属于coretable
,需要用belongsTo方法细化一个hasOne的逆关系:
public function coretable()
{
return $this->belongsTo('App\coretable', 'coretable_id');
}
更多参考:one-to-one