laravel - Laravel 排队作业如何处理已删除的模型作为输入?

标签 laravel jobs laravel-5.2

如果将 Eloquent 模型作为输入传递给 Laravel 排队作业,但模型在作业在队列中运行之前被删除,会发生什么情况?

例如,我正在使用 Laravel 5.2 构建一个电子商务网站,客户可以在其中输入地址和付款方式。付款方式属于地址。但是,如果客户试图删除一个地址,而不是向下级联并删除与其关联的任何支付方式,我会通过将其标记为禁用来软删除该地址。这样,在客户更新与其关联的账单地址之前,仍可使用该付款方式。

但是,如果付款方式被删除并且它引用了一个已被软删除的地址,我想进行一些垃圾收集并从数据库中删除该地址。这不需要同步发生,因此我编写了一个简单的可排队作业来完成此操作。句柄方法如下所示:

public function handle(PaymentMethodRepository $paymentMethodRepository, AddressRepository $addressRepository)
{
    $billingAddress = $paymentMethodRepository->address($this->paymentMethod);

    if ( ! $billingAddress->enabled) {
        $addressRepository->delete($billingAddress);
    }
}

我在 PaymentMethodsController 的 destroy 方法中分派(dispatch)此作业。但是,如果传递给作业的付款方式在作业在队列中执行之前从数据库中删除,作业会失败吗?

我仍在开发网站,因此我没有服务器来部署和测试会发生什么。我知道模型被序列化以放入队列中,但我想知道在恢复模型以执行作业时是否会出现问题。

最佳答案

是的,如果在作业执行之前删除“序列化模型”,作业将失败。模型并未真正序列化 - 作业存储模型类和模型标识符并在执行前获取模型。

为了解决这个问题,您可以将模型的主键存储在作业中,然后在执行作业时检查记录是否存在:

class DeleteAddressJob extends Job implements ShouldQueue
{
    private $addressId;

    public function __construct(int $addressId)
    {
        $this->addressId = $addressId;
    }

    public function handle(AddressRepository $addressRepository)
    {
        $address = $addressRepository->find($this->addressId);

        if (is_null($address)) {
            // Address doesn't exist. Complete job...
            return;
        }

        // Delete the address...
    }
}

关于laravel - Laravel 排队作业如何处理已删除的模型作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377132/

相关文章:

php - Laravel 架构构建器 dateTimeTz 示例看起来如何?

php - 使用 PostgreSQL 进行全文搜索和模糊搜索

javascript - Laravel Blade @foreach 中的 Vue.js v-model 多文本输入问题

php - Laravel/Carbon Timestamp 0000-00-00 00 :00:00 or Unexpected data found. 发现意外数据。数据缺失

php - 在产品价格总和列旁边显示每周交易

ibm-midrange - JT400 - 回复 MSGW 作业

workflow - 如何使用 GitHub 操作跳过矩阵配置?

rest - 从 Rest api 运行 rundeck 作业

php - 在 laravel 5.2 的分页链接中添加了随机字符

laravel - 覆盖 Laravel 队列监听器输出 [仅限 Laravel <=5.2]