【问题标题】:Laravel 4.2 not working recursive on bootLaravel 4.2 在启动时不能递归工作
【发布时间】:2015-02-09 22:10:29
【问题描述】:

例如我有三个模型:

Invoice:有很多卡

Card:有很多serviceLogs

ServiceLog

class Invoice extends Eloquent {

    protected $table = "invoice";
    protected $guarded = ["id"];
    protected $deleted_at = ['deleted_at'];

    use SoftDeletingTrait;

    public static function boot() {
        parent::boot();
        Invoice::deleted(function($invoice) {
            if ($invoice->cards()) {
                if ($invoice->forceDeleting) {
                    $invoice->cards()->forceDelete();
                } else {
                    $invoice->cards()->delete();
                }
            }
        });
    }

    public function cards() {
        return $this->hasMany("Card");
    }
}

class Card extends Eloquent {

    protected $table = "card";
    protected $guarded = ["id"];
    protected $deleted_at = ['deleted_at'];

    use SoftDeletingTrait;

    public static function boot() {
        parent::boot();

        Card::deleted(function($card) {
            if ($card->serviceLogs()) {
                if ($card->forceDeleting) {
                    $card->serviceLogs()->forceDelete();
                } else {
                    $card->serviceLogs()->delete();
                }
            }
        });
    }

    public function serviceLogs() {
        return $this->hasMany("ServiceLog");
    }
}


class ServiceLog extends Eloquent {

    protected $table = "service_log";
    protected $guarded = ["id"];
    protected $deleted_at = ['deleted_at'];

    use SoftDeletingTrait;

}

当 $invoice 被删除时,Invoice 模型的 boot() 函数会自动删除与之关联的所有卡片。

但是在 $card 从上面的函数中删除后,卡片模型的 boot() 函数没有触发。

这样与每个 $card 关联的所有 $serviceLogs 也不会被删除。

我的问题是如何在 Laravel 中删除递归?

【问题讨论】:

    标签: php laravel recursion


    【解决方案1】:

    您需要在每个卡片模型本身上调用delete() 函数。目前您在模型集合上调用它,这不会导致调用每个模型的 boot 方法。

    改为:

    $forceDeleting = $invoice->forceDeleting;
    $invoice->cards->each(function($model) use($forceDeleting){
        if ($forceDeleting) {
            $model->forceDelete();
        } else {
            $model->delete();
        }
    });
    

    同样,如果您的 ServiceLog 模型也有一个您希望被解雇的引导方法,您将需要在 Card ::deleted() 引导方法中遵循相同的方法,并遍历每个 Card 并在每个单独的模型上调用 delete() .

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2018-06-17
      • 2018-08-19
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多