【问题标题】:How to use soft delete to delete many to many relationship models eloquent laravel如何使用软删除删除多对多关系模型 eloquent laravel
【发布时间】:2021-03-30 20:23:17
【问题描述】:

我要删除表中的一个角色。 roles,permissionspermissions_roles的结构分别是:

-- auto-generated definition
create table roles
(
    id         int auto_increment
        primary key,
    name       varchar(200)                        null,
    created_at timestamp default CURRENT_TIMESTAMP not null,
    updated_at timestamp                           null,
    deleted_at timestamp                           null
);

-- auto-generated definition
create table permissions
(
    id         int auto_increment
        primary key,
    name       varchar(200)                        null,
    created_at timestamp default CURRENT_TIMESTAMP not null,
    updated_at timestamp                           null,
    deleted_at timestamp                           null
);

-- auto-generated definition
create table permission_role
(
    role_id       int                                 not null,
    permission_id int                                 not null,
    created_at    timestamp default CURRENT_TIMESTAMP not null,
    updated_at    timestamp                           null,
    deleted_at    timestamp                           null,
    constraint fk2
        foreign key (role_id) references roles (id)
            on update cascade on delete cascade,
    constraint fk3
        foreign key (permission_id) references permissions (id)
            on update cascade on delete cascade
);

create index permission_role_index
    on permission_role (role_id);

create index role_permission_index
    on permission_role (permission_id);

所以,我有RolesModelPermissionsModel 如下:


class BaseModel extends Model
{
    protected $table;
    protected $primaryKey;


    use SoftDeletes;

}




<?php


namespace App\Model;


use Carbon\Carbon;

class RolesModel extends BaseModel
{

    protected $table = 'roles';
    protected $primaryKey = 'id';

    protected static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub

        static::deleting(function ($roles){
            $roles->permissions()->detach();
            $roles->groups()->detach();
        });

    }

    public function permissions()
    {
        return $this->belongsToMany(
            PermissionsModel::class,
            'permission_role',
            'role_id',
            'permission_id');
    }

    public function groups()
    {
        return $this->belongsToMany(GroupsModel::class, 'group_role');
    }
}



<?php


namespace App\Model;


class PermissionsModel extends BaseModel
{
    protected $table = "permissions";
    protected $primaryKey = "id";

    public function roles()
    {
        return $this->belongsToMany(RolesModel::class, 'permission_role');
    }

}


现在,当我删除一个角色时,虽然roles的记录是通过软删除删除的,但permission_role里面的所有行都不会被删除。如何对permission_role 表应用软删除?

【问题讨论】:

标签: php mysql laravel eloquent soft-delete


【解决方案1】:

您可以通过创建模型(不是数据透视模型,而是常规模型)软删除中间表的任何元素。然后您可以检索任何元素并软删除它。

<?php


namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;


class PermissionRole extends Model
{
    use SoftDeletes;

    protected $table = 'permission_role';

...

}

或者您可以尝试在您的 RoleModel 中使用 updateExistingPivot 方法并设置“deleted_at”而不是使用 delete()

$roles->permissions()->updateExistingPivot($permissionId, [
    'deleted_at' => now(),
]);

https://laravel.com/docs/8.x/eloquent-relationships#updating-a-record-on-the-intermediate-table

【讨论】:

  • BaseModel 不是已经有use SoftDeletes 了吗?还是这不是继承的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2018-11-18
  • 2015-05-14
  • 2017-08-03
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多