Laravel: Eloquent create() vs Query Builder insert()
create()
или Query Builder insert()
.$product = [
'name' => 'Some product',
'price' => 123,
'stock_left' => 999
];
// Вы можете использовать Eloquent
Product::create($product); // не забудьте заполнить $fillable в Модели
// Или использовать Query Builder:
Product::insert($product);
У них есть несколько различий.
Различие 1. Возвращает Модель vs Логическое значение
Вот результат запросов из вышеуказанного примера:
// Результат после Product::create():
App\Models\Product {#3866
name: "Some product",
price: 123,
stock_left: 999,
updated_at: "2023-01-07 08:38:02",
created_at: "2023-01-07 08:38:02",
id: 6,
}
// Результат после Product::insert():
true
Таким образом, метод insert()
возвращает только значение true
/false
, в зависимости от того, было ли выражение успешным или нет.
Различие 2. Автозаполнение временных меток и другая магия
Eloquent
Если вы выполните Product::create()
, он автоматически заполнит поля created_at
и updated_at
, потому что это поведение Eloquent.
Если вы выполните команду Query Builder Product::insert()
, ваши временные метки будут NULL
.
Следуя этой логике, insert()
не будет запускать ни одну из функций Eloquent:
- Аксессоры/Мутаторы
- Наблюдатели
- События/Слушатели
- Трейты
Другими словами, insert()
— это буквально запрос к базе данных, вот и всё. Почти как SQL-запрос.
Различие 3. Множественные вставки
Если вы хотите добавить сразу несколько записей, вы можете сделать это с помощью insert()
, но не с create()
.
Представьте себе это:
$products = [
[
'name' => 'Some product',
'price' => 123,
'stock_left' => 999
],
[
'name' => 'Other product',
'price' => 456,
'stock_left' => 9999
],
// ... больше продуктов
];
// Пробуем с Eloquent
Product::create($products);
// General error: 1364 Field 'name' doesn't have a default value...
// Пробуем с Query Builder:
Product::insert($products);
// Result: "true" with 2 records inserted
В Eloquent нет функций create()
или createMany()
для нескольких записей.
Вот почему insert()
часто используют в массовых вставках, таких как импорт данных из CSV или другого источника, вместо того, чтобы выполнять гораздо более медленный foreach
с множеством операций Model::create()
.