تبدیل Collection به Query در لاراول

کار کردن با مجموعه داده های بزرگ نیازمند انعطاف پذیری بالا در نحوه دستکاری و استفاده از اونا برخورداره، درحالی که collection ها متدهای خوبی رو برای کارکردن با داده ارائه می‌دهند ولی برای بازده‌ی بیشتر نیاز داریم که بتونیم به query خودمون برگریدم.

توی لاراول متد toQuery() امده که این فضای خالی رو برای ما پرکنه و کمبودش احساس نشه و collection رو به query builder تبدیل می‌کنه و به ما اجازه میده که عملیات سطح دیتابیسی انجام بدیم و از درخواست های متعدد به دیتابیس جلوگیری می‌کنه.

مثال

<?php

namespace App\Services;

use App\Models\Order;
use App\Events\OrdersProcessed;
use Illuminate\Support\Facades\DB;

class OrderProcessor
{
    public function processReadyOrders()
    {
        $orders = Order::where('status', 'ready')
            ->where('scheduled_date', '<=', now())
            ->get();

        DB::transaction(function() use ($orders) {
            // Convert collection to query for bulk update
            $orders->toQuery()->update([
                'status' => 'processing',
                'processed_at' => now()
            ]);
            // Chain additional operations
            $ordersByRegion = $orders->toQuery()
                ->join('warehouses', 'orders.warehouse_id', '=', 'warehouses.id')
                ->select('warehouses.region', DB::raw('count(*) as count'))
                ->groupBy('region')
                ->get();

            event(new OrdersProcessed($ordersByRegion));
        });
    }

    public function updatePriorities()
    {
        $urgentOrders = Order::where('priority', 'high')->get();

        $urgentOrders->toQuery()
            ->select('orders.*', 'customers.tier')
            ->join('customers', 'orders.customer_id', '=', 'customers.id')
            ->where('customers.tier', 'vip')
            ->update(['priority' => 'critical']);
    }
}Code language: HTML, XML (xml)

به طور کلی کارهایی که توی کد بالا انجام میشه

  1. آپدیت دسته‌ای داده به وسیله transaction safety (که اگر خطایی پیش آمد دیتاها به حالت قبلی برگردند به وسیله DB::transaction).
  2. انجام عملایت join و group بعد از آپدیت (بعد از تبدیل شدن به collection)

با استفاده از toQuery شما به صورت یکپارچه می‌تونید بین collection و query builder جابجا بشید و پروژه لاراولتون رو کارآمدتر کنید

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *