2015-01-11 68 views
1

此问题扩展了Laravel文档中提供的示例Eloquent : Working With Pivot TablesLaravel雄辩 - 访问二级模型关系

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

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

具体来说,有以下方法应该返回task_ids

User::get_tasks($user_id) 
+0

对于'ids'只使用连接,为了方便访问'Task'模型,请使用这个http://stackoverflow.com/a/26187648/784588 –

回答

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(); 
1
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(); 
    } 

} 
0

我认为最巧妙的方法是使用hasManyThrough关系如下:

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

你只需要修改TasksRoles你命名的相应模型。它会返回一份任务清单。希望这可以帮助。

+0

不用,'hasManyThrough'不适用于mm关系。 –

+0

嗯,这取决于。根据问题中的描述,一个用户有很多角色,一个角色有很多任务。在这种情况下,它们都是一对多的关系。 'hasManyThrough'完成这项工作。否则,它不会。 – Ray

+0

请参阅官方文档中的示例:http://laravel.com/docs/4.2/eloquent – Ray