【问题标题】:Soft delete in laravel is not hiding record in viewlaravel 中的软删除不会在视图中隐藏记录
【发布时间】:2021-02-07 11:20:44
【问题描述】:

我正在使用 Eloquent 软删除来删除数据库中的一行。我使用函数destroy,在数据库列deleted_at 中有一个日期,但这并没有隐藏已删除的记录。 我在控制器中的代码。

$query = Role::join('users', 'roles.id', '=','users.role_id');
$user = User::all();
$users = $query->select('users.*','roles.name as role_name')->paginate(10);

我在用户模型中的代码

use SoftDeletes;
use HasFactory;

protected $table = 'users';
protected $guarded = [];
protected $hidden = [
    'password', 'remember_token', 'deleted_at'
];

public function roles() {
    return $this->belongsTo(Role::class);
}

我在模型角色中的代码

use HasFactory;

protected $table = 'roles';
protected $guarded = [];

public function users() {
    return $this->hasMany(User::class);
}

【问题讨论】:

  • 你可以使用$hidden属性protected $hidden = ['deleted_at'];
  • 不工作兄弟:(
  • 为您的问题添加一些代码。你有什么尝试,为什么不工作。很难猜测并找到解决方案。
  • 更新了模型角色中的代码。有人帮我修复这个错误。
  • 为您添加了答案。检查一下。

标签: laravel


【解决方案1】:

看来,这里的问题是连接。软删除是一个 Eloquent 功能,它适用于模型本身,但不适用于连接表。如果您必须连接两个表,则必须查询自己以删除已删除的列。在你的情况下,你可以这样做

$query = Role::join('users', 'roles.id', '=', 'users.role_id');
$user = User::all();
$users = $query->select('users.*', 'roles.name as role_name')->where('users.deleted_at', null)->paginate(10);

所以这将删除已删除的列。但是当你使用关系时,为什么你必须加入自己?这段关系会为你处理。你可以简单地打电话

$roles = Role::with('users')->get();

你可以让每个用户都拥有类似的角色

foreach ($roles as $role) {
    foreach ($role->users as $user) {
        echo $user->attribute;
    }
}

还有给你的便条。您需要将外键名称作为关系定义的第二个参数传递,因为它与 laravel 的命名约定不匹配。

public function roles() {
    return $this->belongsTo(Role::class, 'role_id');
}

public function users() {
    return $this->hasMany(User::class, 'role_id');
}

【讨论】:

  • 感谢您的回复。我可以用你的解决方案修复它。太感谢了。爱你 3000
  • 很高兴有帮助。将此作为已接受的答案进行检查。 :)
【解决方案2】:

如果您使用 eloquent 关系,它会起作用,但现在您使用的是 join。 eloquent orm 的登录是这样的,你可以编写你的 SQL 并查询它,但你必须手动选择你想要或不想要的(在这种情况下你不想要 deleted_at 列被填充的记录。但是如果你使用您可以享受软删除和许多其他功能的好处。

【讨论】:

  • 感谢您的回复。但是为什么其他项目可以做,但这个项目不起作用?如何解决?
  • 其他项目可能使用与此示例不同的方法。也许你使用用户而不是角色模型。如果您尝试将用户加入角色模型可能已修复,但仅检测到已删除的用户而不是角色。我会说使用关系而不是连接有两个原因 1- 更容易:) 2- 有更多好处。是的,连接有更高的性能,但在大多数应用中你感觉不到。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2021-01-27
  • 2014-05-25
  • 2018-04-10
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多