php - 删除模型时分离数据透视表中模型的每条记录

标签 php mysql laravel relationship

假设我有 UserRole 模型。现在我正在做的是从数据库中删除几个用户。例如,我删除了 ID 为 1、2、3 和 4 的用户。现在我想删除数据透视表中 user_id = 1、2、3 或 4 的所有内容。最好的方法是什么?我的意思是 Laravel 实现。

最佳答案

您可以 Hook 用户模型上的删除事件以删除他们的角色。

用户.php

Class User extends Model {

    protected static function boot() {
        static::deleting(function($model) {
             // Whenever we delete a user delete their roles first.
             $model->roles()->sync([]);
        });

    }

    function roles() {
        return $this->belongsToMany('roles');
    }
}

您还可以使用模型事件和观察者来执行此操作,这可能更简洁:https://laravel.com/docs/5.8/eloquent#events .观察者和上述模式的问题是,每当您批量删除时,您都会遇到 n + 1 问题。

如果你想批量删除用户,最有效的方法就是手动从数据透视表中删除数据,像这样:

function deleteUsers($userIds) {
    // Delete the users roles
    DB::('user_roles')
        ->whereIn('user_id', $userIds)
        ->delete();

    // Delete the users
    User::whereIn('id', $userIds)
        ->delete();
}

关于php - 删除模型时分离数据透视表中模型的每条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55994122/

相关文章:

php - 我的 Laravel 项目未连接到 XAMPP 数据库

mysql - 回滚试运行事务后无法继续执行进一步操作

php - node.js 能做什么而 php 不能,反之亦然?

php - 多选下拉列表

mysql - 选择查询中的最后两行

php - SQL 更新方法返回 JSONException

mysql - 如何为mysql中的列提供自动增量?

php - PhpStorm 中的 Blade 模板代码格式问题

javascript - jQuery 代码中 PHP 文件中的 jQuery 变量

php - 是否可以在 laravel echo 中向 channel 发送数据?