Laravel / Eloquent:如何进入删除过程?

时间:2018-08-08 09:35:47

标签: php mysql laravel eloquent

my_items_table删除记录时,我想将记录插入my_items_table_archive

我可以在每个Controller上执行此操作,但是更喜欢挂钩到Eloquent模型

有这样的东西吗?

伪代码:

class MyItem extends Model {
    protected function beforeDelete($record) {
        MyItemArchive::create($record); // add record the archive
        return true; // continue deletion of $record 
    }
}

有什么主意吗?谢谢!

3 个答案:

答案 0 :(得分:4)

是的,有些类似于您的伪代码。

您可以利用Eloquent Events

下面是一个很好的例子:

protected $dispatchesEvents = [
    'deleted' => UserDeleted::class,
    'deleting' => UserDeleting::class
];

所讨论的课程只需要遵守/请遵循:Listeners

您还可以使用雄辩的观察者/观察者模式来获得相似的结果。

让我知道你的生活吧!

答案 1 :(得分:2)

首先使用创建一个新的观察者

php artisan make:observer MyItemObserver

然后

<?php


namespace App\Observers;


class MyItemObserver
{

    public function deleting(MyItem $myItem)
    {
     /// insert new record here
    }
}

现在您进入您的appServiceProvider

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        MyItem::observe(MyItemObserver::class);
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

现在,您的观察者服务器将被挂接到模型事件。

希望这会有所帮助。

答案 2 :(得分:1)

official documentation中所述,使用事件有两种选择。第一个是创建像这样的观察者:

class MyModelObserver
{

    /**
    * Listen to the Model deleting event.
    *
    * @param  User  $user
    * @return void
    */
    public function deleting(User $user)
    {
      // HERE YOUR CODE TO TRANSFER THE MODEL
    }

  }

您不必在AppServiceProvider上注册它

public function boot {
  MyModel::observe(MyModelObserver::class)
}

否则,您可以通过生成特定的类将这些事件添加到模型中:

protected $dispatchesEvents = [
    'deleting' => MyModelDeletingEvent::class,
];

无论如何,如果您使用的laravel版本低于5.4,则应检查文档以了解具体的实现方式,因为$dispatchesEvents不能作为变量使用。