【问题标题】:Laravel boot method to delete relationship tablesLaravel 启动删除关系表的方法
【发布时间】:2015-12-25 17:06:27
【问题描述】:

我的user 模型中有以下引导方法设置:

/**
 * Boot the model.
 *
 */
public static function boot()
{
    parent::boot();

    static::deleting(function($user)
    {
        $user->roles()->detach();
        $user->supervisors()->detach();
        $user->types()->detach();
        $user->rates()->detach();
        $user->miscs()->detach();
        $user->timesheets()->delete();
    });
}

一个用户可以有许多时间表,因此我在用户模型中为时间表设置了hasMany 关系。

/**
 * The timesheets that belong to the user.
 *
 * @return Object
 */
public function timesheets()
{
    return $this->hasMany('App\Models\Timesheet\Timesheet');
}

一个时间表也可以有很多数据,所以我在时间表模型中添加了一个关系:

/**
 * The data that belong to the timesheet.
 *
 * @return Object
 */
public function data()
{
    return $this->hasMany('App\Models\Timesheet\DataTimesheet');
}

我的问题是,当我删除用户时,它应该删除时间表以及与之关联的所有数据。目前,当我删除用户时,它会删除用户和时间表,但不会删除数据(DataTimesheet)。

当我单独删除时间表时,数据会被删除。

谁能建议我在删除用户时如何删除数据?

【问题讨论】:

  • 您使用的是什么 DBMS?因为所有这些通常都可以通过 DBMS 轻松地自动管理,只需在数据库关系中设置正确的外键
  • DBMS 到底是什么意思?我正在使用 MySQL 和 laravel 迁移
  • 然后在为您的数据库创建迁移时,将所有表(角色、主管、时间表等)中的所有 user_id 列设置为指向 user.id 列的foreign key $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

标签: php laravel laravel-4 laravel-5


【解决方案1】:

根据When I delete a timesheet separately, the data gets deleted 语句,我假设您在删除数据的Timesheet 模型上处理了deleting 事件。

为了让Timesheet 模型上的deleting 事件被触发,必须删除Timesheet 实例。在您的用户deleting 事件中,当您调用$user->timesheets()->delete(); 时,这会绕过模型并运行查询以删除记录。因为模型没有被实例化和删除,所以不会调用您的时间表记录上的 deleting 事件。

为了确保调用您的 Timesheet 事件,您可以执行以下操作:

// get all the related timesheet ids
$ids = $user->timesheets()->lists('id');

// pass the ids to delete into the destroy method
\App\Models\Timesheet\Timesheet::destroy($ids);

destroy() 方法将为 id 获取模型集合,并在每个模型上调用 delete(),这将为每个模型触发事件。

【讨论】:

  • 感谢您的帮助和回复。 Laravel 是否没有内置函数来删除属于特定关系的数据透视表数据?这似乎是一种尴尬而冗长的做事方式。
  • @V4n1ll4 在应用程序级别进行级联删除的目的是让您可以控制删除对象的逻辑。如果 Laravel 接管了它,你就失去了控制权,你还不如让它在数据库级别进行编码。我想他们可以提供某种类型的默认助手并让您覆盖它,但他们目前没有。也许去 github 请求这个功能,看看他们怎么说。
猜你喜欢
  • 2017-08-03
  • 2015-05-14
  • 2015-10-08
  • 2015-05-15
  • 2020-08-02
  • 1970-01-01
  • 2016-01-02
  • 2020-12-14
  • 2018-11-03
相关资源
最近更新 更多