Laravel5事件'删除'在Model :: whereIn()上不起作用

时间:2019-12-03 05:31:13

标签: laravel laravel-5

我在用户模型上有一对多的关系,我设置了一个事件,当我删除用户时,它将使所有Childs client失效。 在资源上,控制器销毁方法事件“删除”方法正常工作。

但是我使用Model::whereIn() deleting事件创建了mass massDestroy方法。

下面是我的相关代码,我该如何解决?

UsersController相关代码

public function destroy(User $user)
{
    $user->delete();

    return back();
}

public function massDestroy(MassDestroyUserRequest $request)
{
    if ($request->ajax()) {
        User::whereIn('id', $request->get('ids'))->delete();
    }

    return response(null, Response::HTTP_NO_CONTENT);
}

用户模型相关代码

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use SoftDeletes, Notifiable;

    public $table = 'users';

    //skip

    protected static function boot()
    {
        parent::boot();
        self::deleting(function (User $user) {
           $user->clients()->delete(); //doesn't work on Model::whereIn
        });
    }

    public function clients()
    {
        return $this->hasMany(Client::class, 'user_id', 'id');
    }
}

客户端模型相关代码

public function user()
{
    return $this->belongsTo(User::class ,'user_id', 'id');
}

PS *我尝试按以下方式一一删除(非常丑陋的代码)。

UsersController

public function massDestroy(MassDestroyUserRequest $request)
{
    if ($request->ajax()) {
            $users = User::whereIn('id', $request->get('ids'))->get();
            foreach ($users as $user ) {
                $user ->delete();
            }
    }

    return response(null, Response::HTTP_NO_CONTENT);
}

2 个答案:

答案 0 :(得分:0)

您正在使用函数get()来检索记录集合,并且集合上没有方法delete(),可以使用first()函数删除,也可以通过循环集合数组来删除它们

希望您能得到答案

答案 1 :(得分:0)

laravel文档中明确指出,如果您需要执行批量操作,则不会触发任何事件。您需要使用foreach逐个删除它们。

  

通过Eloquent执行批量删除语句时,不会为已删除的模型触发deletingdeleted模型事件。这是因为执行delete语句时实际上从未检索过模型。

请检查Deleting Models中的注释选项