Laravel v10.20 вышел с совершенно новым методом под названием createOrFirst()
, предоставленным Тони Мессиасом, что может немного сбивать с толку, потому что у Laravel уже был firstOrCreate()
. В чем отличия? Зачем для этого нужны два метода? Давайте взглянем...
createOrFirst()
Новый createOrFirst()
метод предназначен для лучшей работы в средах с высокой параллельностью и помогает уменьшить условия гонки, но требует уникального ограничения для базы данных.
С помощью
createOrFirst
, мы инвертируем этот поток и полагаемся на таблицы, имеющие ограничениеUNIQUE
. Итак, сначала мы пытаемся создать запись, и если мы получаем исключение из базы данных и определяем, что это уникальное нарушение ограничений, мы пытаемся найти соответствующую запись. Таким образом, параллельные процессы могут полагаться на характеристики ACID базы данных и больше никогда не беспокоиться об этом состоянии гонки.
Более подробную информацию вы можете узнать в запросе на вытягивание.
firstOrCreate()
firstOrCreate
was the original method, and here is how it's currently defined in the docs:
Метод firstOrCreate попытается найти запись базы данных, используя заданные пары столбец/значение. Если модель не может быть найдена в базе данных, будет вставлена запись с атрибутами, полученными в результате слияния первого аргумента массива с необязательным аргументом
второго массива Что также круто в этом новом методе, так это то, что теперь исходный firstOrCreate
метод использует новый createOrFirst
под капотом. Итак, это происходит:
- attempts to find
- if missing, attempts to create
- if UNIQUE violation happens, attempt another find because we ran into that race condition
Что использовать?
Я бы сказал, что в большинстве приложений оригинал firstOrCreate
в порядке, и вы действительно захотите использовать createOrFirst
его только тогда, когда находитесь в параллельной среде с тоннами трафика.