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ącychUNIQUE
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:
- attempts to find
- if missing, attempts to create
- 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.