【问题标题】:Eloquent how to do something when delete or update operate on a special modelEloquent 在特殊模型上进行删除或更新操作时如何做某事
【发布时间】:2019-06-05 01:21:45
【问题描述】:

我的大部分数据库表包含create_user_idupdate_user_id

当我使用save()update()insert()createOrUpdate()等方法时,如何自动更新这两个字段。

例如,我执行这个脚本:

$model = Model::find(1);
$model->model_f = 'update';
$model->save();

那么这条记录的model_f 更新了,update_user_id 也更新了。

我知道 eloquent 可以自动管理 update_time 并且我已经使用它了。但是我想在更新或插入或删除时做点别的事情

PS:我有一个名为USERID的常量来记住当前用户的id

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.7


    【解决方案1】:

    您可以使用Observers。 您可以在您的模型上挂钩以下事件:

    retrieved  
    creating
    created
    updating
    updated
    saving
    saved
    deleting
    deleted
    restoring
    restored
    

    让我举一个例子,我们试图挂钩App/User 模型发出的事件。您可以稍后更改它以匹配您的特定模型。

    要创建观察者,请运行以下命令:

    php artisan make:observer UserObserver --model=User
    

    然后,您可以挂钩到观察者中的特定事件。

    <?php
    
    namespace App\Observers;
    
    use App\User;
    
    class UserObserver
    {
    
        /**
        * Handle the User "saved" event.
        *
        * @param  \App\User  $user
        * @return void
        */
        public function saved(User $user)
        {
            //
        }
    
    
        /**
        * Handle the User "created" event.
        *
        * @param  \App\User  $user
        * @return void
        */
        public function created(User $user)
        {
            //
        }
    
        /**
        * Handle the User "updated" event.
        *
        * @param  \App\User  $user
        * @return void
        */
        public function updated(User $user)
        {
            //
        }
    
    }
    

    由于在您的特定情况下,您希望挂钩这 3 个事件,因此您可以定义上述事件并在调用这些事件时对您的模型执行其他操作。

    别忘了在你的AppServiceProvider 中注册这个观察者。

    <?php
    
    namespace App\Providers;
    
    use App\User;
    use App\Observers\UserObserver;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
        * Bootstrap any application services.
        *
        * @return void
        */
        public function boot()
        {
            User::observe(UserObserver::class);
        }
    
        /**
        * Register the service provider.
        *
        * @return void
        */
        public function register()
        {
            //
        }
    }
    

    【讨论】:

      【解决方案2】:

      有一种非常简单的方法可以自动更新create_user_idupdate_user_id

      Step1:
      

      打开你的应用文件夹并创建一个名为UserStampsTrait.php的新文件

      Step:2
      

      并粘贴以下代码

      <?php
      namespace App;
      use Illuminate\Support\Facades\Auth;    
      trait UserStampsTrait
      {
       public static function boot()
        {
          parent::boot();
          // first we tell the model what to do on a creating event
          static::creating(function($modelName='')
          {
             $createdByColumnName = 'create_user_id ';
            $modelName->$createdByColumnName = Auth::id();
          });
      
          // // then we tell the model what to do on an updating event
          static::updating(function($modelName='')
          {
            $updatedByColumnName = 'update_user_id';
            $modelName->$updatedByColumnName = Auth::id();
          });    
        }
      }
      

      就是这样

      Step:3
      

      打开需要自动更新相应模型的模型

      例如,它可能是Post

      <?php
      namespace App;
      use Illuminate\Database\Eloquent\Model;
      use App\UserStampsTrait;
      class Post extends Model
      {
          use UserStampsTrait;
      }
      

      就是这样

      【讨论】:

        猜你喜欢
        • 2022-10-03
        • 2016-02-13
        • 1970-01-01
        • 2017-01-29
        • 2015-01-28
        • 2015-03-28
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多