Laravel v10.20 вийшов з абсолютно новим методом під назвою createOrFirst()
, внесений Тоні Мессіасом, який може бути трохи заплутаним, оскільки Laravel вже мав pull.firstOrCreate()
. У чому відмінності? Навіщо для цього потрібні два методи? Давайте подивимося...
createOrFirst()
Новий createOrFirst()
метод розроблений для кращої роботи в дуже паралельних середовищах і допомагає зменшити гоночні умови, але вимагає унікального обмеження в базі даних.
За допомогою
createOrFirst
, ми інвертуємо цей потік і спираємося на таблиці, що маютьUNIQUE
обмеження. Отже, спочатку ми намагаємося створити запис, і якщо ми отримуємо виняток із бази даних і виявляємо, що це унікальне порушення обмежень, ми намагаємося знайти відповідний запис. Таким чином, паралельні процеси можуть покладатися на характеристики ACID бази даних і більше ніколи не доведеться турбуватися про цю гоночну умову.
Більш детальну інформацію ви можете дізнатися за запитом
pull.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
лише тоді, коли перебуваєте в одночасному середовищі з великою кількістю трафіку.