2017-02-17 5 views
0

내 POST 양식에서 사용자는 다른 사용자를 방에 추가 할 수 있습니다. 링크에 고유 한 제약 조건을 적용했습니다 (사용자와 객실 간의 링크에 중복 된 항목이 없음). 그러나 양식을 제출 한 후 내 페이지 (f5)를 새로 고칠 때 Laravel은 개체가 이전에 첨부되었는지 확인하지만 중복 항목에 대해 불평합니다.Laravel - many-to-many 관계로 연결된 객체를 찾을 수 없습니다.

여기에 코드입니다 :

$roomUsers = Room::find($request->room_id)->users(); 

if ($request->add != null) { 
    foreach ($request->add as $uId) 
     // if null, user hasnt been attach yet 
     if (!$roomUsers->find($uId)) { 
      Log::debug($roomUsers->find($uId) == null ? 'null' : 'not null'); 
      // then we can attach him 
      $roomUsers->attach($uId); 
     } 
} 

라인 !$roomUsers->find($uId)true를 반환 아직 객체는 이전 반복에 부착되어 있습니다. 어떻게 가능합니까? 감사합니다.

+0

이 작업을 위해 컨트롤러 기능을 게시 할 수 있습니까? –

+0

관계를 정의한 모델도 게시하십시오. –

답변

1

각 체크마다 BelongsToMany의 새 인스턴스를 만들지 않아 위 코드가 작동하지 않는 이유가 있습니다. 즉, find 번으로 전화 할 때마다 새로운 검색어를 실제로 만들지 않고 기존 검색어에 추가하는 것입니다.

는 귀하의 요청에 효과적으로 될 것이다 마지막으로 [1, 2, 3] 확인하는 추가 식별자를 말한다 :

SELECT * FROM users WHERE id = 1 AND id = 2 AND id = 3 

위의 논리를 유지하기 위해 당신이 할 수 있습니다 :

$room = Room::find($request->room_id); 

if ($request->add != null) { 
    foreach ($request->add as $uId) 
     // if null, user hasnt been attach yet 
     if (!$room->users()->find($uId)) { 
      // then we can attach him 
      $room->users()->attach($uId); 
     } 
} 

아니면 훨씬 더 간단합니다 이 문제를 해결할 방법은 syncWithoutDetaching입니다. 이 도움이

$roomUsers = Room::find($request->room_id); 

if ($request->has('add')) { 
    $roomUsers->users()->syncWithoutDetaching($request->add); 
} 

희망 :

코드는 다음과 같을 수 있습니다!