Laravel Eloquent - 访问二级模型关系


Laravel Eloquent - accessing second level model relationship

这个问题扩展了Laravel文档中提供的示例Eloquent : Working Pivot Table。

此处的关系是用户具有许多可以与之相关的角色对象。在此扩展中,每个角色将涉及许多 Task 对象,从而为我们提供第二级多对多关系。

使用雄辩的ORM,访问用户相关任务的最简洁方式是什么?

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

User::get_tasks($user_id)
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();
    }
}

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

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

您只需修改TasksRoles到您命名的相应模型。它将返回任务列表。希望这有帮助。

尽管

@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();