经过几次尝试,我无法做出雄辩的“关系”。
我使用MySQL Workbech创建了一个数据库,其中包含以下表格:
他们的关系图:
在PHP中,我有以下代码(摘要):
class ActorData extends Model
{
protected $table = 'actordata';
[..]
public function nationality()
{
return $this->hasOne("App\Models\ActorData\Nationality");
}
}
class Actor extends Model
{
protected $table = 'actors';
[..]
public function actorData()
{
return $this->hasOne('App\Models\ActorData');
}
}
我的目标是,当我叫“->国籍”时,我希望它取“国籍”,但是我却发现“空”或找不到关于“键”的错误。
$actorData = \App\Models\Actor::find(1)->actorData()->first();
var_dump($actorData->nationality);
我知道“ hasOne”在“国籍”中寻找密钥,但是我想建立一个简单的“链接”。 作为另一种解决方案,我可以简单地使用“ Nationality_Id”并在“ Nationality”表中查找它,但是我认为这是错误的方法。
我希望我已经筋疲力尽,感谢您的配合。
(为了“修复”,我必须添加“ $ actorData-> nationality()-> associate($ nationality))
答案 0 :(得分:0)
您的关系应该类似于上面。
其中actorData是其他两个表的数据透视表。
您的课程应如下所示:
class Actors extends Model{
public function nationality() {
return $this->belongsToMany(Nationality::class);
}
}
class Nationality extends Model {
public function actors() {
return $this->belongsToMany(Actors::class);
}
}
您基本上正在看Many-to-Many。每个演员可以有许多国籍,而每个国籍可以同时属于许多演员。
通常laravel希望数据透视表的名称类似actor_nationality
,但是您可以指定表名称:
return $this->belongsToMany(ModelClassGoesHere, 'PIVOT TABLE GOES HERE', 'FIRST TABLE ID', 'SECOND TABLE ID');
答案 1 :(得分:0)
为什么不能将nationality_id
直接放在actors
表上,因为它们只能有一个。这样,您在Actor
上的关系就是
public function nationality() {
return $this->hasOne(Nationality::class);
}
那么您可以$actor->nationality;
您的国籍将是...
class Nationality extends Model {
public function actors() {
return $this->hasMany(Actor::class);
}
}