Laravel: Eloquent create() vs Query Builder insert()

Источник: «Eloquent create() VS Query Builder insert() Method»
Чтобы добавить запись в базу данных, вы можете использовать один из двух методов Eloquent 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.

Результаты выполнение create() и insert()

Следуя этой логике, 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().

Дополнительные материалы

Предыдущая Статья

CSRF: Как предотвратить уязвимость

Следующая Статья

PHP 8.3: gc_status дополнительная информацию о GC