Laravel: firstOrCreate() vs createOrFirst() в чому різниця?
У Laravel v10.20 з'явився новий метод createOrFirst()
, чим він відрізняється від існуючого метода firstOrCreate()
?
Відповіді на питання (1)
У Laravel v10.20 з'явився новий метод createOrFirst()
, запропонований Тоні Мессіасом (Tony Messias), який може дещо заплутати, оскільки в Laravel вже був firstOrCreate()
. У чому ж полягає різниця?
createOrFirst()
Новий метод createOrFirst()
призначений для кращої продуктивності в висококонкурентних середовищах та допомагає зменшити конфлікти, але вимагає наявності унікального індекса в базі даних.
За допомогою createOrFirst
ми інвертуємо цей процес і розраховуємо на те, що таблиці мають унікальний індекс. Спочатку ми намагаємося створити запис, і якщо ми отримуємо від бази даних виключення, і встановлюємо, що це порушення унікального індекса, ми намагаємося замість цього знайти відповідний запис. Таким чином, конкурентні процеси можуть розраховувати на характеристики ACID бази даних і більше не турбуватися про цю конфліктну ситуацію.
firstOrCreate()
firstOrCreate
був оригінальним методом, і ось як він зараз визначений в документації:
Метод firstOrCreate
намагатиметься знайти запис в базі даних за допомогою вказаних пар колонка/значення. Якщо модель не вдасться знайти в базі даних, буде вставлено запис з атрибутами, отриманими в результаті злиття першого аргументу масиву з необов'язковим другим аргументом масиву
Що ще круто в цьому новому методі, так це те, що тепер оригінальний метод firstOrCreate
використовує новий метод createOrFirst
під капотом. Отже, це відбувається наступним чином:
- спроба знайти;
- якщо не знайдено, спроба створення;
- якщо відбувається порушення унікальності, спроба іншого пошуку через конфліктну ситуацію.
Що використовувати?
Я б сказав, що для більшості програм, оригінальний firstOrCreate
підійде, і ви захочете використовувати createOrFirst
тільки тоді, коли будете працювати в висококонкурентному середовищі з великими обсягами трафіку.