Laravel Eloquent - 访问二级模型关系

时间:2015-01-11 21:11:14

标签: php laravel model eloquent object-relational-model

此问题扩展了Laravel文档中提供的示例Eloquent : Working With Pivot Tables

这里的关系是用户有许多与之相关的 Role 对象。在此扩展中,每个角色将与许多Task对象相关联,为我们提供第二级别的多对多关系。

使用Eloquent ORM,访问用户所涉及的任务的最佳方式是什么?

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

User::get_tasks($user_id)

3 个答案:

答案 0 :(得分: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();
    }

}

答案 1 :(得分: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();

答案 2 :(得分:0)

我认为最好的方法是使用hasManyThrough关系,如下所示:

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

您只需要将TasksRoles修改为您指定的相应模型。它将返回一个任务列表。希望这会有所帮助。