2015-02-05 1 views
0

역할 배열을 사용하여 $users의 목록을 반환하려고합니다.belongsToMany 관계가 연결된 객체를 반환 할 수 없습니다.

여기 내 컨트롤러 :

$users = DB::table('users')->take(5)->skip(2)->get(); 

    foreach ($users as $user) 
    { 
     $user = User::with('roles')->find($user->id); 
    } 

    return Response::json(array(
     'users' => $users 
    )); 

그리고 여기 모델 관계이다 :

public function roles() 
{ 
    return $this->belongsToMany('Role')->withTimestamps(); 
} 

그러나 이것은 단지에 부착 된 역할없이 사용자를 반환합니다. 그러나 이렇게하면 :

return Response::json(array(
    'users' => User::with('roles')->get() 
)); 

각 사용자에게 부여 된 역할에 대한 전체 목록을 얻을 수 있습니다. 그래서 내가 뭘 잘못하고 있니? 나는이 할 경우

이상하게 그런 다음

return Response::json(array(
    'users' => User::with('roles')->find($user->id) 
)); 

을이 역할을 가진 사용자가 내가 기대했던, 그래서 왜 안 foreach 성명에서 반환로 있음을 반환?

+0

컨트롤러에서'$ users'를 반환하면'foreach' 루프는'$ user'에서'User' 인스턴스를 생성하지만'$ users'에 영향을 미치지 않기 때문에 응답에서 다시 보내지지 않습니다 어떠한 방식으로. 단어에 넣기는 어렵지만 'User :: with ...'를 호출하면 원래 '$ users' 배열에 아무런 영향을 미치지 않는다는 것을 이해하고 있습니까? (편집 : 그의 답변에서 @lukasgeiter가 말한 것) –

답변

2

DB 개의 쿼리를 사용할 때 Eloquent 릴레이션 기능이 모두 손실됩니다.

당신 수 단지

$users = User::with('roles')->take(5)->skip(2)->get(); 

좋은 연습이 직접 DB 쿼리 (DB::table('user')...->get)와 하지 혼합 웅변 모델 "스타일"쿼리 (User::...->get())이다.

1

foreach은의 값으로 을 사용합니다. 즉, 실제 배열 항목은 변경하지 않고 값의 복사본 만 변경합니다. 그 변경 참조로 전달 된 항목 을 얻으려면 추가 할 & :

그러나
foreach ($users as &$user) { 
    $user = User::with('roles')->find($user->id); 
} 

왜 그냥 이런 식으로하지 않는다?

$users = User::with('roles')->take(5)->skip(2)->get(); 
return Response::json(array(
    'users' => $users 
)); 
관련 문제