如何在Laravel(5.4)

时间:2017-05-19 15:58:13

标签: laravel eloquent laravel-5.4

如何在Laravel(5.4)中的pivot(中间)表中创建一个列,然后在其上过滤结果?

我有两个模型,Films和CastAndCrew。 CastAndCrew是从事电影制作的各种导演,制片人和演员。数据透视表应该定义CastAndCrew成员和Film之间的关系类型。显然,某人可能是一部电影中的演员和另一部电影中的制作人,所以我无法在CastAndCrew表的条目中定义它,因为它只适用于一部电影,而且可能与其他电影不同。所以我假设我必须在数据透视表中定义关系,但我不确定如何准确地执行此操作。到目前为止我得到了什么:

class Film extends Model
{
    protected $fillable = array('filmtitle', 'description');

    public function List_Directors()
        {
        return $this->belongsToMany('App\CastAndCrew')->withPivot('type')->wherePivot('type', 'director');
        }

    public function List_Actors()
        {
        return $this->belongsToMany('App\CastAndCrew')->withPivot('type')->wherePivot('type', 'actor');
        }
}

class CastAndCrew extends Model
{
    protected $fillable = array('firstname', 'lastname');

    public function List_Films_With_Director()
        {
        return $this->belongsToMany('App\Film')->withPivot('type')->wherePivot('type', 'director');
        }

    public function List_Films_With_Actor()
        {
        return $this->belongsToMany('App\Film')->withPivot('type')->wherePivot('type', 'actor');
        }
}

当新的CastAndCrew成员被添加到网站时,我打算使用附加方法,例如添加新导演:

$newcastcrew->CastAndCrew::create(['firstname' => Request::get('firstname'), 'lastname' => Request::get('lastname')]);

$newcastcrew->List_Films_With_Director()->attach($filmID, ['type' => 'director']);

1。)是吗?

2。)->withPivot('type')是否在数据透视表中创建了'type'列?如果没有,我在哪里/如何定义它?

2。)大概->wherePivot('type', 'director')中的Film->List_Directors()条款会返回那部电影导演的CastAndCrew成员吗? (这就是我想要的)

更正非常感谢!

由于

1 个答案:

答案 0 :(得分:1)

你的想法和逻辑非常好。您可能希望添加没有类型条件的关系来获取用户的所有电影以及电影的所有演员和工作人员。您还需要更好地命名您的方法和关系。我已经为你清理了代码。如果您愿意,请随意使用。

class Film extends Model
{
    protected $fillable = array('filmtitle', 'description');

    public function castAndCrew()
    {
        return $this->belongsToMany('App\CastAndCrew')->withPivot('type');
    }

    public function directors()
    {
        return $this->castAndCrew()->wherePivot('type', 'director');
    }

    public function actors()
    {
        return $this->castAndCrew()->wherePivot('type', 'actor');
    }
}

class CastAndCrew extends Model
{
    protected $fillable = array('firstname', 'lastname');

    public function films()
    {
        return $this->belongsToMany('App\Film')->withPivot('type');
    }

    public function filmsAsDirector()
    {
        return $this->films()->wherePivot('type', 'director');
    }

    public function filmsAsActor()
    {
        return $this->films()->wherePivot('type', 'actor');
    }
}