Первый или Создать
Я знаю, используя:
User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));
Проверяет, существует ли пользователь первым, если он не создает его, но как он проверяет? Проверяет ли он все предоставленные параметры или есть способ указать конкретный параметр, например. могу ли я просто проверить, что адрес электронной почты существует, а не имя - поскольку два пользователя могут иметь одинаковое имя, но их адрес электронной почты должен быть уникальным.
Ответы
Ответ 1
firstOrCreate()
проверяет наличие всех аргументов перед finds
совпадением. Если не все аргументы совпадают, то будет создан новый экземпляр модели.
Если вы хотите только проверить конкретное поле, используйте firstOrCreate(['field_name' => 'value'])
только с одним элементом массива. Это вернет первый элемент, который соответствует или создает новый, если не найдено совпадений.
Разница между firstOrCreate()
и firstOrNew()
:
-
firstOrCreate()
автоматически создаст новую запись в базе данных, если она не найдена. В противном случае он предоставит вам соответствующий элемент.
-
firstOrNew()
предоставит вам новый экземпляр модели для работы, если совпадение не найдено, но будет сохранено только в базе данных, когда вы это явно сделаете (вызов save()
в модели). В противном случае он предоставит вам соответствующий элемент.
Выбор одного или другого зависит от того, что вы хотите сделать. Если вы хотите изменить экземпляр модели до ее сохранения в первый раз (например, установите name
или какое-либо обязательное поле), вы должны использовать firstOrNew()
. Если вы можете просто использовать аргументы для немедленного создания экземпляра новой модели в базе данных без его модификации, вы можете использовать firstOrCreate()
.
Ответ 2
Предыдущий ответ устарел. Это возможно сделать за один шаг, так как Laravel 5.3, firstOrCreate
теперь имеет второй параметр values
, который используется для новой записи, но не для поиска
$user = User::firstOrCreate([
'email' => '[email protected]'
], [
'firstName' => 'Taylor',
'lastName' => 'Otwell'
]);
Ответ 3
Обновление:
По сравнению с Laravel 5.3 это делается за один шаг; метод firstOrCreate
теперь принимает необязательный второй массив в качестве аргумента.
Первый аргумент массива - это массив, по которому сопоставляются поля/значения, а второй массив - дополнительные поля, используемые при создании модели, если совпадение не найдено путем сопоставления полей/значений в первом массиве
См. документацию
Ответ 4
firstOrCreate() проверяет все присутствующие аргументы, прежде чем найдет совпадение.
Если вы хотите проверить только определенное поле, используйте firstOrCreate (['field_name' => 'value']), например,
$user = User::firstOrCreate([
'email' => '[email protected]'
], [
'firstName' => 'abcd',
'lastName' => 'efgh',
'veristyName'=>'xyz',
]);
Тогда он проверяет только электронную почту