2017-02-17 3 views
0

в моей форме POST пользователи могут добавлять других пользователей в комнату. Я установил уникальное ограничение на ссылку (нет дубликатов в ссылке между пользователями и комнатами). Однако, когда я обновляю свою страницу (f5) после отправки формы, Laravel жалуется на повторяющиеся записи, хотя я проверяю, прикреплены ли объекты раньше.Laravel - не удалось найти() прикрепленный объект во многих отношениях во всех отношениях

Вот код:

$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)возвращает истину пока объект был присоединен в предыдущей итерации. Как это возможно? Спасибо

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

Надеется, что это помогает!

Смежные вопросы