【问题标题】:withCount() doesn't include deleted rows?withCount() 不包括已删除的行?
【发布时间】:2017-06-14 17:39:13
【问题描述】:

如何使withCount('comments') 也包含所有已删除/已删除的行?

例如,如果我有 5 个 cmets,我删除了 1 个,我仍然希望 withCount('comments') 返回 5,但实际上它返回的是 4。

我的完整查询如下所示:

$query = Post::withTrashed()
    ->withCount('comments')
    ->get();

【问题讨论】:

  • 如果有适合您的答案,请将您的问题标记为已回答。

标签: laravel laravel-5 laravel-5.3


【解决方案1】:

由于 laravel 在使用 withCount 时没有提出过滤关系的方法,一个干净的解决方案是声明关系并将withTrashd() 添加到其中。

Post.php

public function commentsWithTrashed()
{
    return $this->comment()->withTrashed();
}

现在你可以在上面使用withCount了。

$query = Post::withTrashed()
    ->withCount('commentsWithTrashed')
    ->get();

【讨论】:

    【解决方案2】:

    我觉得你可以试试这个

    $query = Post::withCount('comments')
        ->withTrashed()
        ->get();
    

    $query = DB::table('post')
             ->select('comments', DB::raw('count(*) as comments'))
             ->get();
    

    希望这对你有用!

    【讨论】:

      【解决方案3】:

      你可以使用 withTrashed 方法:

      >withTrashed()
      

      【讨论】:

      • 我不是要获取已删除的行,而是要获取所有行的 COUNT,包括已删除的行。
      • 这样的东西行不通? $count = Model::where('column','value')->withTrashed()->count();
      • 如果可以,我宁愿在同一个查询下完成。
      • 现在我看到了您的完整查询,我会尝试 $query = Post::withCount('cmets')->withTrashed() ->get();如果这不起作用,您可能必须在模型中的关系上使用 withTrashed() 。您可以为此定义第二个关系。
      【解决方案4】:

      您可以将其添加到计数中

      $query = Post::withCount(['comments'=> function ($query) {$query->onlyTrashed();])
               ->get();
      

      它工作正常。

      【讨论】:

        猜你喜欢
        • 2018-05-13
        • 1970-01-01
        • 2016-11-27
        • 2021-02-06
        • 1970-01-01
        • 2018-01-18
        • 2020-05-23
        • 1970-01-01
        • 2014-12-11
        相关资源
        最近更新 更多