2

这个问题扩展了 Laravel 文档中提供的 Eloquent示例:使用数据透视表。

这里的关系是一个用户有许多可以关联的角色对象。在这个扩展中,每个角色都将与许多任务对象相关联,从而为我们提供了第二级多对多关系。

使用 Eloquent ORM,访问与用户相关的任务的最佳方式是什么?

具体来说,以下方法应该返回一个 task_ids 数组

User::get_tasks($user_id)
4

3 回答 3

2
use Illuminate\Database\Eloquent\Collection;

class User extends Eloquent {

   // ... relation methods...

    public function get_tasks($id)
    {
        $tasks = static::with('roles.tasks')->find($id)->roles->lists('tasks');

        return (new Collection(array_flatten($tasks)))->unique();
    }

}
于 2015-01-11T21:17:54.040 回答
0

我相信最简洁的方法是使用 hasManyThrough 关系,如下所示:

class User extends Eloquent {
    public function get_tasks()
    {
        return $this->hasManyThrough('Tasks', 'Roles');
    }
}

你只需要修改TasksRoles为你命名对应的模型。它会返回一个任务列表。希望这可以帮助。

于 2015-01-12T02:45:28.340 回答
0

尽管@JosephSilber 的答案看起来不错,但不幸的是,当我测试它时它并没有工作,所以这里有一些对我的安装有用的东西:

public static function get_tasks($id){
    $tasks = static::with('roles.tasks')->find($id)->roles->lists('tasks');
    $collection = new \Illuminate\Database\Eloquent\Collection();
    foreach($tasks as $roleTasks){
        $collection = $collection->merge($roleTasks);
    }
    return $collection;
}

就个人而言,我会将语法更改为:

public function getTasks(){
    $this->load('roles.tasks');
    $tasks = $this->roles->lists('tasks');
    $collection = new \Illuminate\Database\Eloquent\Collection();
    foreach($tasks as $roleTasks){
        $collection = $collection->merge($roleTasks);
    }
    return $collection;
}

User::find($user_id)->getTasks();
于 2015-01-11T22:06:02.253 回答