首页 文章

如何根据Laravel中多对多关系中的额外外键过滤响应?

提问于
浏览
0

我在Laravel的这种多对多关系中遇到了困难 . 我有多对多的关系,项目和人 . 我还有第三个表,角色(有2列:id,name),其中包含一个人可以在项目中拥有的角色(在这种情况下,“演员”,“导演”等) . 数据透视表person_project具有列“person_id”,“project_id”和“role_id” . 我成功地让所有与项目相关的人都使用了

$project = Project::find($id);
$project->persons;

但是,我怎样才能让具有特定角色的人参与项目?我怎么能挽救这种关系呢?

楷模:

// Project.php

class Project extends Eloquent {

    protected $table = 'projects';
    public $timestamps = false;

    public function persons() {
        return $this->belongsToMany('Person');
    }
}

// Person.php

class Person extends Eloquent {

    protected $table = 'persons';
    public $timestamps = false;

    public function projects() {
        return $this->belongsToMany('Project');
    }
}

2 回答

  • 1

    This article有助于弄清楚检索关系 . Eloquent的withPivot()和join()方法是让它发挥作用的关键 .

    // In the Project model
    
    public function persons() {
        return $this->belongsToMany('Person')
                    ->withPivot('role_id')
                    ->join('roles', 'role_id', '=', 'roles.id');
    }
    

    我从Laravel的文档中找到了插入部分:http://laravel.com/docs/eloquent#inserting-related-models在这个例子中,Input :: get('directors')是一个person_ids数组,被选择连接到"director"的角色 . 对于Input :: get('actors'),同样的交易 .

    // Within the update method of the Projects controller
    
    foreach (Input::get('directors') as $directorId) {
        $project->persons()->attach($directorId, array('role_id' => 1)); // roles.id 1 = "director"
    }
    
    foreach (Input::get('actors') as $actorId) {
        $project->persons()->attach($actorId, array('role_id' => 2)); // roles.id 2 = "actor"
    }
    
  • 0

    请尝试以下方法之一:

    如果您使用 Laravel 4.1

    $project = Project::whereHas('persons', function($q)
    {
        $q->where('role_id', 1);
    
    })->get();
    

    Laravel 4 and 4.1:

    $project = Project::with(array('persons' => function($query)
    {
        $query->where('role_id', 1);
    }))->get();
    

相关问题