如何在 Laravel 中链接 Bus::chain()

问题描述

我有三个 Laravel Parent 作业名称

        AutopOChargeCalculation::dispatch($invoice_id,$user_id,$notify)->onQueue('invoice');
        AutoSOChargeCalculation::dispatch($invoice_id,$notify)->onQueue('invoice');
        AutoSPChargeCalculation::dispatch($invoice_id,$notify)->onQueue('invoice');

inside 他们每个人都用 for 循环调用子作业


 foreach ($objects as  $object) {

            $jobs[] = new CalculateSingleSaleOrderCharge($model,$object,$notify,$i,$total_objects);
         $i ++;
        }
        Bus::chain($jobs)->onQueue('invoice')->dispatch();
    }
 foreach ($objects as  $object) {

            $jobs[] = new CalculateSinglePurchaSEOrderCharge($model,$total_objects);
         $i ++;
        }
        Bus::chain($jobs)->onQueue('invoice')->dispatch();
    }

 foreach ($objects as  $object) {

            $jobs[] = new CalculateSingleStoragePeriodCharge($model,$total_objects);
         $i ++;
        }
        Bus::chain($jobs)->onQueue('invoice')->dispatch();
    }

现在我正在考虑删除父作业并链接所有子作业总线


 Bus::chain($jobs)->onQueue('invoice')->dispatch()->withChain(
 Bus::chain($jobs)->onQueue('invoice')->dispatch())->withChain(
 Bus::chain($jobs)->onQueue('invoice')->dispatch());


Is that Possible?

解决方法

通过新的 Laravel 8 更新,您现在可以将一批作业发送到队列中,此外,您还可以批量链式作业。

use App\Jobs\ReleasePodcast;
use App\Jobs\SendPodcastReleaseNotification;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;

Bus::batch([
    [
        new ReleasePodcast(1),new SendPodcastReleaseNotification(1),],[
        new ReleasePodcast(2),new SendPodcastReleaseNotification(2),])->then(function (Batch $batch) {
    // ...
})->dispatch();

在此处查看文档。 Chains Within Batches - Laravel 8