• Czas czytania ~1 min
  • 23.08.2023

Laravel v10.20 wyszedł z zupełnie nową metodą o nazwie createOrFirst(), przyczynił się Tony Messias, co może być nieco mylące, ponieważ Laravel miał firstOrCreate()już . Jakie są różnice? Dlaczego potrzebujemy do tego dwóch metod? Rzućmy okiem...

createOrFirst()

Nowa createOrFirst() metoda została zaprojektowana tak, aby działała lepiej w wysoce współbieżnych środowiskach i pomaga zmniejszyć warunki wyścigu, ale wymaga unikatowego ograniczenia bazy danych.

Za pomocą createOrFirst, odwracamy ten przepływ i polegamy na tabelach mających UNIQUE ograniczenie. Najpierw próbujemy utworzyć rekord, a jeśli otrzymamy wyjątek z bazy danych i zidentyfikujemy, że jest to unikatowe naruszenie ograniczeń, zamiast tego spróbujemy znaleźć pasujący rekord. W ten sposób współbieżne procesy mogą polegać na charakterystyce ACID bazy danych i nigdy więcej nie muszą się martwić o warunki wyścigu.

Więcej informacji można znaleźć na temat żądania ściągnięcia.

firstOrCreate()

firstOrCreate was the original method, and here is how it's currently defined in the docs:

Metoda firstOrCreate podejmie próbę zlokalizowania rekordu bazy danych przy użyciu podanych par kolumna/wartość. Jeśli modelu nie można znaleźć w bazie danych, zostanie wstawiony rekord z atrybutami wynikającymi z połączenia pierwszego argumentu tablicy z opcjonalnym drugim argumentem

tablicy Fajne w tej nowej metodzie jest również to, że teraz oryginalna firstOrCreate metoda używa nowej createOrFirst pod maską. Więc to się dzieje:

  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

Którego użyć?

Powiedziałbym, że w większości aplikacji oryginał firstOrCreate jest w porządku i naprawdę chcesz używać createOrFirst tylko wtedy, gdy jesteś w równoległym środowisku z mnóstwem ruchu.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297