• Час читання ~0 хв
  • 23.08.2023

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 під капотом. Отже, мимо:

  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