【问题标题】:Update Folder Count on cascade delete in Laravel via eloquent通过 eloquent 在 Laravel 中更新级联删除的文件夹计数
【发布时间】:2019-05-28 16:15:31
【问题描述】:

我有 3 张桌子:

  1. 任务
  2. 文件夹
  3. 文件夹任务

Tasks 表将包含所有 task_nameFolder 表将包含 folder_nametask_countFolder Tasks 是一个支点将存储folder_idtask_id 的表。

所有表都有多对多关系。

我添加了级联删除任务。所以,如果我删除一个任务,那么它将在所有地方删除,包括数据透视表。我正在使用 eloquent delete 删除任务。这工作正常

但是,一旦我删除了一个任务,我需要更新 Folders 表中每个文件夹的任务数。

由于一个任务可以存储在多个文件夹中,因此很难在级联删除的任务中更新所有文件夹的task_count 的计数。我被困在这里了。

如何更新所有task_count 的受影响文件夹?

【问题讨论】:

  • 到目前为止你尝试了什么?您删除项目的方法是什么样的?
  • 我试图获取所有具有域的文件夹,然后我尝试更新所有返回文件夹 domain_count 但如果我有大量文件夹要更新,这不是正确的方法。所以,寻找更好的解决方案。我尝试以下查询来获取包含该域的所有文件夹。 $task_table = Tasks::find($task_id);$task_table->folders()->wherePivot('task_id','=',$task_id)->get()
  • 您删除项目的方法是什么样的?
  • 这里是删除任务的代码:Tasks::where('id', $task_id)->delete();。这将在任何地方删除该特定任务,包括包含该任务的文件夹。
  • "包括包含此任务的文件夹" - 关联的文件夹被删除了吗?我不完全明白,我认为需要更新相关文件夹?还是您在谈论数据透视表?

标签: mysql laravel eloquent


【解决方案1】:

您可以使用 mysql 触发器。这是一个例子。

USE `test`;
DELIMITER 
$$
CREATE TRIGGER `tasks_ADEL` 
AFTER DELETE ON tasks FOR EACH ROW
-- Edit trigger body code below this line. Do not edit lines above this one
BEGIN
   update folder as f right join folder_tasks as ft on f.id = ft.folder_id set task_count = task_count + 1 where ft.task_id = OLD.id
END;
$$

在这里你可以找到使用示例https://www.w3resource.com/mysql/mysql-triggers.php#MTAD

【讨论】:

  • 好的,但是我如何在 laravel eloquent 中做到这一点?
  • 你可以用 mysql 数据库运行它..或者你可以为此创建一个迁移..它将自动完成其余的事情。
  • 用于对任何数据库事务执行操作的触发器将在关联的 db 表上发生...在事务之前或事务之后。 After 任务删除的典型示例。
【解决方案2】:

最后,我找到了自己更新tasks_count 的方法。这可能不是有效的方法,但可以解决问题。

$task = Tasks::find($domain_id);
$folders = $task->folders->pluck('pivot.folder_id');
Tasks::where('user_id', $user_id)->where('id', $domain_id)->delete();
foreach($folders as $key => $value){
    $folder_table = Folder::find($value);
    $folder_table->tasks_count = $folder_table->tasks()->count();
    $folder_table->save();
}

【讨论】:

    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多