createMany эквивалент для updateOrCreate - PullRequest
0 голосов
/ 04 марта 2019

Есть ли createMany эквивалент для updateOrCreate в Laravel для того, когда вы хотите "updateOrCreate" много записей за один вызов?

Другими словами, есть ли какая-то функция updateOrCreateMany?

Из документации, по-видимому, нет функции с таким именем, но, возможно, есть еще один дружественный способ сделать это Laravel ... или я должен просто использовать foreach (возможно, также использовать MySQL вставить на дубликат функция)?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я предлагаю использовать цикл foreach для ваших данных и использовать метод updateOrCreate

foreach($records as $record){
   Model::updateOrCreate([$record->id, $record->name], [$record->likes, $record->dislikes]);
}
0 голосов
/ 04 марта 2019

Исходя из документации от Laravel, нет, для eloquent не существует метода, подобного updateOrCreateMany

Если вы подумали, это имеет смысл, потому что выполнение все равно понадобитсябыть последовательным.Возможно, что какая-то запись может повлиять на предыдущую, поэтому режим вставки или обновления не может быть одновременным.Таким образом, даже если бы существовал такой метод, он все равно использовал бы цикл для внутреннего выполнения запроса один за другим.

Чтобы прояснить ситуацию, скажем, был метод updateOrCreateMany, который, вероятно, мог бы принимать ввод как массивмассивы, например, так:

Model::updateOrCreateMany([
   [
      'email' => 'x@y.com'
   ],
   [
      'email' => 'x2@y2.com'
   ],
   [
      'email' => 'x@y.com'
   ]
],
[
   [
      'name' => 'X Y'
   ],
   [
      'name' => 'X2 Y2'
   ],
   [
      'name' => 'X Y Updated'
   ]
]);

Как вы можете видеть, запись 3 должна обновлять запись 1, поэтому, по сути, вы не можете ввести все сразу, сравнивая каждый из них с образом базы данных времени вставки записи1Таким образом, вы будете вводить ошибку дублированного электронного письма, так как x@y.com изначально не существовало.

Следовательно, не существует метода updateOrCreateMany, потому что он не может быть выполнен одновременно, он должен быть последовательным, что означает некотороемеханизм зацикливания вроде foreach.

Кстати, хороший вопрос!+ 1

Имеет смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...