我在用户模型上有一对多的关系,我设置了一个事件,当我删除用户时,它将使所有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);
}
答案 0 :(得分:0)
您正在使用函数get()
来检索记录集合,并且集合上没有方法delete()
,可以使用first()
函数删除,也可以通过循环集合数组来删除它们
希望您能得到答案
答案 1 :(得分:0)
laravel文档中明确指出,如果您需要执行批量操作,则不会触发任何事件。您需要使用foreach
逐个删除它们。
通过Eloquent执行批量删除语句时,不会为已删除的模型触发
deleting
和deleted
模型事件。这是因为执行delete语句时实际上从未检索过模型。
请检查Deleting Models中的注释选项