Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩-访问二级模型关系_Php_Laravel_Model_Eloquent_Object Relational Model - Fatal编程技术网

Php Laravel雄辩-访问二级模型关系

Php Laravel雄辩-访问二级模型关系,php,laravel,model,eloquent,object-relational-model,Php,Laravel,Model,Eloquent,Object Relational Model,这个问题扩展了Laravel文档中提供的示例 这里的关系是一个用户有许多可以关联的角色对象。在这个扩展中,每个角色将与多个任务对象相关,这为我们提供了第二层多对多关系 使用雄辩的ORM,访问与用户相关的任务的最整洁的方式是什么 具体来说,下面的方法应该返回一个task_id数组 User::get_tasks($user_id) 尽管@JosephSilber的答案看起来很棒,但很不幸,当我测试它时,它不起作用,所以这里有一些在我的安装中起作用的东西: public static functi

这个问题扩展了Laravel文档中提供的示例

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

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

具体来说,下面的方法应该返回一个task_id数组

User::get_tasks($user_id)

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

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

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

您只需将
任务
角色
修改为指定的相应模型。它将向您返回一份任务列表。希望这有帮助。

对于
id
仅使用联接,为了方便访问
任务
模型,请使用此Nope,
hasManyThrough
不适用于m-m关系。这取决于。根据问题中的描述,一个用户有多个角色,一个角色有多个任务。在这种情况下,它们都是一对多关系
hasManyThrough
完成这项工作。你误读了这个问题:给我们第二个层次的多对多关系。
class User extends Eloquent {
    public function get_tasks()
    {
        return $this->hasManyThrough('Tasks', 'Roles');
    }
}