Перший або створити


77

Я знаю, використовуючи:

User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));

Перевіряє, чи існує користувач першим, якщо він не створює його, але як він перевіряє? Чи перевіряє він усі параметри, що надаються, чи існує спосіб вказати конкретний параметр, наприклад, чи можу я просто перевірити, чи існує електронна адреса, а не ім’я - оскільки два користувачі можуть мати одне і те ж ім’я, але їх електронну адресу потрібно унікальний.

Відповіді:


143

firstOrCreate()перевіряє наявність усіх аргументів перед findsзбігом. Якщо не всі аргументи збігаються, буде створено новий екземпляр моделі.

Якщо ви хочете перевірити лише певне поле, використовуйте firstOrCreate(['field_name' => 'value'])лише один елемент у масиві. Це поверне перший відповідний елемент або створить новий, якщо не знайдено збігів.

Різниця між firstOrCreate()і firstOrNew():

  • firstOrCreate()автоматично створить новий запис у базі даних, якщо збіг не знайдено. В іншому випадку це дасть вам відповідний предмет.
  • firstOrNew()надасть вам новий екземпляр моделі для роботи, якщо не знайдено збіг, але буде збережений у базі даних лише тоді, коли ви це явно зробите (зателефонувавши save()до моделі). В іншому випадку це дасть вам відповідний предмет.

Вибір між тим чи іншим залежить від того, що ви хочете зробити. Якщо ви хочете змінити екземпляр моделі, перш ніж вона буде збережена вперше (наприклад, встановлення nameабо якогось обов’язкового поля), вам слід скористатися цим firstOrNew(). Якщо ви можете просто використовувати аргументи, щоб негайно створити новий екземпляр моделі в базі даних, не змінюючи його, ви можете використовувати firstOrCreate().


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

Дякую, я зробив: $ user = User :: firstOrNew (array ('email' => Input :: get ('email'))); $ user-> name = Input :: get ('name'); $ user-> save (); Правильно?
пантро

Я змінив його на firstOrNew, чи я повинен був використовувати firstOrCreate?
пантро

Ви можете зробити це в один крок: $user = User::firstOrCreate(array('email' => Input::get('email'), 'name' => Input::get('name'))).
lowerends

Ви не можете зробити все за один крок. Якщо новий користувач має той самий електронний лист, АЛЕ інше ім'я, він створить новий запис (він повинен оновити його, оскільки електронний лист унікальний). Отже, чому я не можу робити масове призначення. Якщо ви не знаєте про виправлення?
пантро

73

Попередня відповідь застаріла. Це можна досягти за один крок, оскільки Laravel 5.3 firstOrCreateтепер має другий параметр values, який використовується для нового запису, але не для пошуку

$user = User::firstOrCreate([
    'email' => 'dummy@domain.com'
], [
    'firstName' => 'Taylor',
    'lastName' => 'Otwell'
]);

27
Я вважаю важливим згадати, що поля, які ви хочете прив'язати до бази даних, потрібно додавати до protected $fillableвідповідної моделі, оскільки вона використовує масове призначення.
WhyAyala

Чому повідомлення Ayala дуже важливо. Причина, якщо ви включите до захищеного $ fillable = ['email']; тільки ключі від першого методу firstOrCreate параметра запиту буде як -> Вставити в ім'я_таблиці ( «електронна пошта», updated_at, created_at) VALUES ...
darjus

3

Оновлення:

Починаючи з Laravel 5.3, робити це за один крок можливо; firstOrCreateметод тепер приймає необов'язковий другий масив в якості аргументу.

Перший аргумент масиву - це масив, з яким узгоджуються поля / значення, а другий масив - це додаткові поля, які слід використовувати при створенні моделі, якщо не знайдено збігу через відповідність полів / значень у першому масиві:

Див. Документацію


1
Чудова додаткова інформація. Може бути зроблено як коментар, а не як така відповідь; )
hugomosh

3

firstOrCreate () перевіряє наявність усіх аргументів, перш ніж він знайде збіг.

Якщо ви хочете перевірити лише певне поле, використовуйте firstOrCreate (['field_name' => 'value']) як

$user = User::firstOrCreate([
    'email' => 'abcd@gmail.com'
], [
    'firstName' => 'abcd',
    'lastName' => 'efgh',
    'veristyName'=>'xyz',
]);

Тоді він перевіряє лише електронну пошту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.