Laravel Observer 创建工作但删除不工作

Min*_*ngh 6 php laravel laravel-5

我正在尝试使用观察者来删除关系,但问题是当我在创建的函数中执行 DD 时,它工作正常,但是当我在删除的函数中执行 DD 时,它什么也不显示(POSTMAN)意味着既不工作也不出错

这是 API:

$api->post('store','App\Http\Controllers\CustomerController@store');
$api->delete('delete/{id}','App\Http\Controllers\CustomerController@destroy');
Run Code Online (Sandbox Code Playgroud)

这是工匠制作的观察者文件

namespace App\Observers;

use App\Customer;

class CustomerObserver
{
    public function created(Customer $customer)
    {
        dd($customer);  
    }

    public function deleted(Customer $customer)
    {
        dd($customer); 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是客户控制器

class CustomerController extends Controller
{
    public function store(Request $request)
    {
        return Customer::store($request->person);
    }

    public function destroy($id)
    {
       $delete = Customer::where('person_id',$id);
       $delete->delete();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是客户模型文件。

class Customer extends Model
{
    //Relationship Start From Here
    public function person()
    {
        return $this->belongsTo(Person::class);
    }

    //End Here

    public static function store($request)
    {
        //Call to Person Model And Save User
        $user = Person::store($request);

        //Create object of Customer Model
        $customer = new Customer();
        $customer->fill($request['customers']);
        $customer->person()->associate($user)->save();

        //return customer 
        return $customer;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 9

我知道这可能是一个迟到的答复,不确定您是否仍在寻找答案。我认为问题在于如何删除模型Customer

当你做类似的事情时

$delete = Customer::where('person_id',$id);
$delete->delete();
Run Code Online (Sandbox Code Playgroud)

您正在执行批量删除语句。正如Laravel 文档中所述,这就是您的观察者事件未触发的mass deletes will not fire any model events for the models that are deleted原因。deleted

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

现在看看如何创建Customer. 您一次创建一个模型。因此你的created观察者确实会运行。

//Create object of Customer Model
$customer = new Customer();
$customer->fill($request['customers']);
$customer->person()->associate($user)->save();
Run Code Online (Sandbox Code Playgroud)

要解决你的问题,最简单的方法就是检索所有模型并一一删除,这样就可以触发事件。

foreach (Customer::where('person_id',$id)->get() as $delete) {
   $delete->delete();
}
Run Code Online (Sandbox Code Playgroud)


Jig*_*sar 2

你能做所有事情吗

1 在 CustomerServiceProvider方法Customer::observe(CustomerObserver::class);中添加行boot

  1. 添加CustomerServiceProvider到app.php文件中的provider数组中

  2. composer dump-autoload

  3. php artisan config:cache