eloquent 模型的正确关系
Right relation for eloquent model
经过多次尝试,我无法做出 eloquent "relations" 作品。
我使用 MySQL Workbech 创建了一个数据库,其中包含以下 tables:
- 演员
- 演员数据
- 国籍
他们的关系图:
在 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');
}
}
我的目标是,当我调用“->nationality”时,我希望它使用 "nationality",但我收到 "null" 或关于 "keys" 的错误未找到。
$actorData = \App\Models\Actor::find(1)->actorData()->first();
var_dump($actorData->nationality);
我明白 "hasOne" 在 "nationality" 中查找密钥,但我想做一个简单的 "link"。
作为另一种解决方案,我可以简单地使用 "Nationality_Id" 并在 "Nationality" table 中查找它,但我认为这是一种错误的方法。
希望我已经详尽无遗,感谢您的合作。
(为了 "fix" 我必须添加“$actorData->nationality()->associate($nationality))
你们的关系应该像上面那样。
其中 actorData 是其他 2 个 table 的枢轴 table。
您的 类 应如下所示:
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 期望枢轴 table 的名称类似于 actor_nationality
,但您可以指定 table 名称:
return $this->belongsToMany(ModelClassGoesHere, 'PIVOT TABLE GOES HERE', 'FIRST TABLE ID', 'SECOND TABLE ID');
为什么不能把nationality_id
直接放在actors
table上面,因为他们只能有一个。那么你们在 Actor
上的关系就是
public function nationality() {
return $this->hasOne(Nationality::class);
}
那么你可以$actor->nationality;
您的国籍 class 将是...
class Nationality extends Model {
public function actors() {
return $this->hasMany(Actor::class);
}
}
经过多次尝试,我无法做出 eloquent "relations" 作品。
我使用 MySQL Workbech 创建了一个数据库,其中包含以下 tables:
- 演员
- 演员数据
- 国籍
他们的关系图:
在 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');
}
}
我的目标是,当我调用“->nationality”时,我希望它使用 "nationality",但我收到 "null" 或关于 "keys" 的错误未找到。
$actorData = \App\Models\Actor::find(1)->actorData()->first();
var_dump($actorData->nationality);
我明白 "hasOne" 在 "nationality" 中查找密钥,但我想做一个简单的 "link"。 作为另一种解决方案,我可以简单地使用 "Nationality_Id" 并在 "Nationality" table 中查找它,但我认为这是一种错误的方法。
希望我已经详尽无遗,感谢您的合作。
(为了 "fix" 我必须添加“$actorData->nationality()->associate($nationality))
你们的关系应该像上面那样。
其中 actorData 是其他 2 个 table 的枢轴 table。
您的 类 应如下所示:
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 期望枢轴 table 的名称类似于 actor_nationality
,但您可以指定 table 名称:
return $this->belongsToMany(ModelClassGoesHere, 'PIVOT TABLE GOES HERE', 'FIRST TABLE ID', 'SECOND TABLE ID');
为什么不能把nationality_id
直接放在actors
table上面,因为他们只能有一个。那么你们在 Actor
上的关系就是
public function nationality() {
return $this->hasOne(Nationality::class);
}
那么你可以$actor->nationality;
您的国籍 class 将是...
class Nationality extends Model {
public function actors() {
return $this->hasMany(Actor::class);
}
}