• Время чтения ~0 мин
  • 23.08.2023

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 под капотом. Итак, это происходит:

  1. attempts to find
  2. if missing, attempts to create
  3. if UNIQUE violation happens, attempt another find because we ran into that race condition

Что использовать?

Я бы сказал, что в большинстве приложений оригинал firstOrCreate в порядке, и вы действительно захотите использовать createOrFirst его только тогда, когда находитесь в параллельной среде с тоннами трафика.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297