雄辩模型的正确关系

时间:2018-11-15 10:14:14

标签: php eloquent relational-database mysql-workbench slim-3

经过几次尝试,我无法做出雄辩的“关系”。

我使用MySQL Workbech创建了一个数据库,其中包含以下表格:

  • 演员
  • ActorData
  • 国籍

他们的关系图:

relationship

在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))

2 个答案:

答案 0 :(得分:0)

enter image description here

您的关系应该类似于上面。

其中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);
    }
}