Оптимізуйте масштабні вставки за допомогою методу fillAndInsert() у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 03 травня, 2025
В Laravel з'явилася нова функція fillAndInsert(), яка вирішує важливу проблему під час масових операцій з Eloquent. Чи готові ви дізнатися, як ця методика підвищує продуктивність без втрати можливостей Eloquent? Читайте статтю, щоб розкрити всі переваги нововведення

Метод fillAndInsert() у Laravel вирішує поширену проблему в масштабних операціях Eloquent. Ця функція забезпечує кастинг на рівні моделі та підготовку атрибутів під час масового вставлення, усуваючи традиційний компроміс між продуктивністю та функціональністю

Розробники, які працюють із масовим вставленням, зазвичай стоятимуть перед вибором: використати insert() для швидкості, але втратити потужні можливості Eloquent, або створити окремі моделі для повної функціональності, але знизити продуктивність. Метод fillAndInsert() об'єднує обидва ці переваги, застосовуючи правильний кастинг, таймстампи та підготовку атрибутів, зберігаючи ефективність масового вставлення:

User::fillAndInsert([
    [
        'name' => 'Taylor',
        'email' => 'taylor@example.com',
        'role' => UserRole::Admin,
    ],
    [
        'name' => 'Nuno',
        'email' => 'nuno@example.com',
        'role' => 3, // Буде приведено до enum
    ],
]);

Цей метод особливо корисний для моделей, що використовують можливості кастингу Eloquent:

class Invoice extends Model
{
    protected $fillable = [
        'number', 'amount', 'status', 'client_id', 'metadata'
    ];
 
    protected function casts(): array
    {
        return [
            'amount' => 'decimal:2',
            'status' => InvoiceStatus::class,
            'metadata' => 'array',
            'id' => 'string',
        ];
    }
 
    public static function boot()
    {
        parent::boot();
 
        static::creating(function ($model) {
            if (empty($model->id)) {
                $model->id = Str::uuid();
            }
        });
    }
}
 
// Масове вставлення з правильним кастингом та генерацією UUID
Invoice::fillAndInsert([
    [
        'number' => 'INV-2023-001',
        'amount' => '1450.75',
        'status' => InvoiceStatus::Paid,
        'metadata' => ['payment_method' => 'credit_card', 'ref' => 'TX12345'],
    ],
    [
        'number' => 'INV-2023-002',
        'amount' => '299.99',
        'status' => 'pending', // Рядок буде приведено до enum
        'metadata' => json_encode(['payment_method' => 'bank_transfer', 'ref' => 'BT54321']), // Рядок буде приведено до масиву
    ],
    [
        'number' => 'INV-2023-003',
        'amount' => 750,
        'status' => 0, // Ціле число буде приведено до enum
        'metadata' => ['payment_method' => 'paypal', 'ref' => 'PP98765'],
    ],
]);

Метод fillAndInsert() дозволяє розробникам підтримувати чисті й узгоджені шаблони коду, скориставшись як передовими можливостями кастингу Eloquent, так і перевагами продуктивності масових операцій. Це додавання є значним поліпшенням у роботі для розробників Laravel, які працюють з великими наборами даних.