如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表

Posted

技术标签:

【中文标题】如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表【英文标题】:How to create a trigger to populate a table in database based on saved data in another table from laravel controller 【发布时间】:2021-04-26 14:24:37 【问题描述】:

我正在使用 Laravel 创建一个 API,我试图根据数据库中另一个表中保存的数据来填充数据库中的一个表。所以table 1数据保存后,应该触发table 2数据也被保存。

这是表1

的Controller的代码
 public function create(Request $request)
    
        //
        $this->validate($request, [
            'name' => 'required|unique:users',
            'code' => 'required'
        ]);

            Auth::user();
            $user = new User();
            $user->inputed_code = $request->inputed_code;
            $user->code = $request->code;
            $user->save();

            return response([
                    'success' => true,
                    'message' => 'Data has been saved!!',
                    'data' => $user,
                ], Response::HTTP_OK);
     

这是 table 2 的控制器,我想根据 table 1 的结果通过触发效果填充它。

public function reward(Request $request)
    
        //
        $reward = new Reward();
        $reward->user_id = DB::table('users')->get(id)
        $reward->points = $request->referral_reward;
        $reward->save();
        $user = $request->only('user_id');
        $reward = Reward::where('user_id', '=', $user)->update([
            'referral_reward' => 5
            ]);
        return response()->json([
            'success' => true,
            'message' => 'You have been awarded 5 points',
            'data' => $reward,
        ], Response::HTTP_CREATED);
    

这里是 API 路由

Route::post('applycode', 'UserController@create');
Route::post('reward', 'RewardController@reward');

请问我做错了什么,有没有更好的方法来解决这个问题是给出相同的结果。

谢谢

【问题讨论】:

您可以在表 1 中创建 created 挂钩,以便在创建表 1 数据时触发表 2 的创建 【参考方案1】:

我了解到,基于已保存的 User 模型,您希望在 rewards 表中保存一些内容。

您可以使用Eloquent events。在User 模型中注册一个事件,如下所示:

class User extends Model 

// ... other stuff

  protected $dispatchesEvents = [
    'saved' => UserSaved::class,
  ];


然后您需要通过运行php artisan make:event UserSaved 创建您的事件文件,这将创建一个文件app/Events/UserSaved.php。在此文件中的__construct 方法中,您将收到受影响的模型作为参数。

public function __construct(User $user)

  // ... do sth

那么你需要事件监听器 see the docs 来消费事件

定义和映射 Eloquent 事件后,您可以使用事件监听器来处理事件。

然后在侦听器中,您可以执行您想要应用于 Rewards 模型的所有逻辑。

【讨论】:

以上是关于如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表的主要内容,如果未能解决你的问题,请参考以下文章

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

如何根据oracle中另一个表中的值更新一个表中的字段[重复]

Laravel 刀片:如何删除预先填充的表单字段数据(在 db 中另存为空)

根据 Kohana 中另一个表中的数据对 mysql 结果进行排序

使用 laravel 将数据保存在 2 个不同的表中

根据表中另一个现有列的内容更改 SQL Server 中的现有列