2015-01-11 3 views
1

이 질문은 Laravel 문서에서 제공되는 예제 Eloquent : Working With Pivot Tables을 확장합니다.Laravel Eloquent - 두 번째 레벨 모델 관계에 액세스합니다.

여기서 관계는 사용자에 많은 역할이 있습니다. 관련이있는 객체는입니다. 이 확장에서 각 역할은 여러 Task 객체와 관련되어 두 번째 수준의 다 대다 관계를 제공합니다.

Eloquent ORM을 사용하면 사용자가 관련있는 작업에 가장 깔끔하게 액세스 할 수 있습니다.

특히, 다음과 같은 방법은 @ JosephSilber의 대답은 내가 그것을 테스트 때 불행히도 작동하지 않았다 멋지다 비록 task_ids

User::get_tasks($user_id) 
+0

'ids'에 대해서만'Task' 모델에 쉽게 접근하기 위해 join을 사용하십시오. http://stackoverflow.com/a/26187648/784588 –

답변

0

의 배열을 반환해야합니다, 그래서 여기에 근무 뭔가 내 설치 :

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; 
} 

가 개인적으로 나는 조금이에 구문을 변경 것 :

당신은 당신의 이름 해당 모델에 TasksRoles을 수정해야

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

:

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 관계를 사용하는 것입니다 생각합니다. 그것은 당신에게 작업 목록을 반환합니다. 희망이 도움이됩니다.

+0

아니요, hasManyThrough는 mm 관계에 대해 작동하지 않습니다. . –

+0

글쎄, 그것은 다릅니다. 문제의 설명에 따르면 한 사용자는 많은 역할을하고 한 역할은 많은 작업을 수행합니다. 이 경우, 그것들은 모두 일대 다 관계입니다. 'hasManyThrough'는 그 일을합니다. 그렇지 않으면 그렇지 않습니다. – Ray

+0

공식 문서의 예제를 참조하십시오. http://laravel.com/docs/4.2/eloquent – Ray