Запитати

Laravel: firstOrCreate() vs createOrFirst() в чому різниця?

Вирішено
28 серпня 2023 · 8 ·
0

У Laravel v10.20 з'явився новий метод createOrFirst(), чим він відрізняється від існуючого метода firstOrCreate()?

laravel php

Відповіді на питання (1)

28 серпня 2023
0
Обране рішення

У Laravel v10.20 з'явився новий метод createOrFirst(), запропонований Тоні Мессіасом (Tony Messias), який може дещо заплутати, оскільки в Laravel вже був firstOrCreate(). У чому ж полягає різниця?

createOrFirst()

Новий метод createOrFirst() призначений для кращої продуктивності в висококонкурентних середовищах та допомагає зменшити конфлікти, але вимагає наявності унікального індекса в базі даних.

За допомогою createOrFirst ми інвертуємо цей процес і розраховуємо на те, що таблиці мають унікальний індекс. Спочатку ми намагаємося створити запис, і якщо ми отримуємо від бази даних виключення, і встановлюємо, що це порушення унікального індекса, ми намагаємося замість цього знайти відповідний запис. Таким чином, конкурентні процеси можуть розраховувати на характеристики ACID бази даних і більше не турбуватися про цю конфліктну ситуацію.

firstOrCreate()

firstOrCreate був оригінальним методом, і ось як він зараз визначений в документації:

Метод firstOrCreate намагатиметься знайти запис в базі даних за допомогою вказаних пар колонка/значення. Якщо модель не вдасться знайти в базі даних, буде вставлено запис з атрибутами, отриманими в результаті злиття першого аргументу масиву з необов'язковим другим аргументом масиву

Що ще круто в цьому новому методі, так це те, що тепер оригінальний метод firstOrCreate використовує новий метод createOrFirst під капотом. Отже, це відбувається наступним чином:

  • спроба знайти;
  • якщо не знайдено, спроба створення;
  • якщо відбувається порушення унікальності, спроба іншого пошуку через конфліктну ситуацію.

Що використовувати?

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


Для відповіді на запитання необхідно авторизуватись

Вхід / Реєстрація