【问题标题】:Create trigger for different inserts为不同的插入创建触发器
【发布时间】:2018-09-15 08:25:46
【问题描述】:

我有不同的桌子

  1. bookings(id,lesson_id,user_id)
  2. 课程(id,name,date,start_time,end_time,max_enrollments,enrollments)
  3. 许可(user_id,membership_id,used_entries,valid_until,entries)

我如何创建一个触发器,每次在预订中添加新记录时,都会增加表允许的enrollments(表课程)和entries 提前致谢!

【问题讨论】:

  • “如何创建触发器”是什么意思?你看过官方文档吗?到目前为止,您尝试过什么?

标签: mysql sql laravel eloquent


【解决方案1】:

你可以使用Observers

AppServiceProvider 上注册您的观察者,然后使用以下代码创建一个观察者:

namespace App\Observers;

use App\Booking;
use App\Lessons;
use App\Permit;

class BookObserver
{
    /**
     * Listen to the Booking created event.
     *
     * @param  \App\Booking  $books
     * @return void
     */
    public function created(Booking $books)
    {
        Lessons::find($books->lesson_id)->increment('enrollments');
    }
}

通过在boot 上添加此行,在App\Providers\AppServiceProvider 中注册观察者

Booking::observe(BookObserver::class);

别忘了给你的模型和观察者打电话:

use App\Booking;
use App\Observers\BookObserver;

【讨论】:

  • 你是如何注册的,课程预订 public function course() { return $this->belongsTo(\App\Models\Lesson::class, 'lessons_id'); }
  • 就这样 return public function course() { $this->belongsTo('\App\Models\Lesson'); }。这应该工作
  • 我不明白它只是在创建里面插入函数课程?
  • 你怎么知道 OP 是 Eloquent 问题没有被这样标记?
  • 不,您必须创建一个文件(我在 awnser 中向您展示的观察者)并将其注册到文件 AppServiceProvider.只有这样框架才能理解观察者指向模型。查看官方文档
【解决方案2】:

我会在您需要数据时进行汇总,而不是这样做。即不用管理Lessons.enrollmentsPermits.entries 的状态,而是在需要时通过查询来计算它们:

SELECT COUNT(*) FROM Bookings B WHERE B.user_id = ? and B.lession_id = ?

这可以让您计算用户和课程的预订次数

然后:

SELECT COUNT(*) FROM Permits P WHERE P.user_id = ?

这可以让您计算用户的条目数

这样,您不必担心保持可以单独计算的值是最新的,这将更容易管理,因为您知道您有来自查询的最新数字。

正确创建索引(在 Permits.user_idBookings.user_idBookings.lesson_id 上(或者更好的是,在 Bookings 列上创建复合索引),这些查询将非常快。

【讨论】:

  • 事实是我已经这样做了,但某人告诉我这很糟糕,我就像......
  • 你是什么意思某人告诉你它很糟糕?什么是某人?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多