在 laravel 5.4 中检索软删除的用户帖子

Posted

技术标签:

【中文标题】在 laravel 5.4 中检索软删除的用户帖子【英文标题】:Retrieve soft deleted user posts in laravel 5.4 【发布时间】:2017-10-05 05:39:15 【问题描述】:

有没有办法在 laravel 5.4 中检索与软删除用户相关的帖子?我在想,既然用户仍在数据库中,应该有办法。

【问题讨论】:

通常“软删除”是通过在该记录上将布尔标志“已删除”设置为 true 来完成的。对于纯用户方列表,查询跳过带有“已删除”的查询。但是正如您所说,他们仍然在那里进行直接链接或为现有帖子命名。我没有使用 laravel 5.4 的经验,但应该没有技术上的原因导致没有办法。覆盖或默认值都可以轻松完成此操作。将更多赌注押在覆盖上(数据库查询的性能原因)。 软删除用户 a) 将用户留在数据库中(去查看)并且 b) 对其关系没有任何作用(除非您编写了自己的逻辑来执行此操作)。您是否尝试过以任何方式访问这些帖子?你用的是什么代码? 是的,但是由于某种原因,当我软删除用户及其帖子时,每次都会失败 public function destroy($id) $admins = User::findOrFail($id); $admins->project()->delete(); $admins->project()->delete();返回重定向()->返回();这是我使用的销毁方法,我已经设置了关系和其他所有内容 是的,当然失败了。找不到用户,因为它已被删除。您不希望普通查询返回已删除的记录。您需要使用withTrashed 访问已删除的项目,或者您可以在用户之前删除关系。这在“查询软删除模型”部分的the documentation 中有非常清楚的说明。 【参考方案1】:

当您软删除一条记录时,它会在数据库中得到flagged,但该记录仍然存在。

你仍然可以像这样检索它:

$users = App\User::withTrashed()->get();

【讨论】:

【参考方案2】:

我认为这应该可行。

Post::whereHas('users', function ($q) 
    $q->whereNotNull($q->getModel()->getQualifiedDeletedAtColumn());
)->get();

它基本上是在连接表deleted_at 列中添加一个where 子句,即not null。或者这个,单行可能也可以。

User::with('posts')->onlyTrashed()->get()->map->posts->collapse();

onlyTrashed 是在SoftDeletes trait 中定义的方法,如here 所述。除了onlyTrashed,还有更多的“范围扩展”,分别是restorewithTrashedwithoutTrashed

我不知道,但我认为在collapse 之后添加->unique('id') 也很好。

【讨论】:

当 OP 只需要 User::withTrashed()->whereId($id)->first(); 时,这太复杂了 @ceejayoz OP 问题:有没有办法检索与软删除的用户相关的帖子。关系。 好的,但现在我尝试删除两个用户并发布它只是删除用户而不是帖子。公共函数销毁($id) $admins = User::findOrFail($id); $管理员->删除(); $admins->project()->delete();返回重定向()->返回(); 这个代码是 laracasts 上使用的代码。由于某种原因,它没有获取与使用相关联的帖子,而只是获取用户并将其删除。这是它在 HomeController.php 第 70 行中显示 FatalThrowableError 的错误:在 null 上调用成员函数 delete() @Chay22 一旦 OP 有了用户,他们就会像往常一样做$user->posts @ceejayoz 和第二个 sn-p 一样正常,不是吗?【参考方案3】:

我不希望恢复已删除的帖子并保留自己的用户已删除,因为这将返回损坏的关系。

但如果你想恢复它并知道已删除用户的 ID,你可以这样恢复:

Post::onlyTrashed()->where('user_id', $id)->restore();

再次,我建议不要这样做。

【讨论】:

【参考方案4】:

$onlySoftDeleted = Post::onlyTrashed()->get();

获取所有已删除的记录

【讨论】:

以上是关于在 laravel 5.4 中检索软删除的用户帖子的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 Eloquent where parent

Laravel 5.5 模型上的自定义软删除

Laravel 5.4:无法从关系中检索数据

Laravel 5.4 - 在已经登录的情况下创建另一个用户帐户

ajax 类型的帖子在 laravel 5.4 中不起作用

基于关系数据的查询 |拉拉维尔 5.4