Laravel 在 withCount 方法上使用 where 子句

2022-08-30 15:06:44

我正在尝试使用这段代码在 laravel 雄辩的查询生成器的 withCount 方法上做一个 where 子句。

$posts = Post::withCount('upvotes')->where('upvotes_count', '>', 5)->get();

这个代码给了我这个错误。

SQLSTATE[42S22]: 未找到列: 1054 “where clause” 中的未知列 “upvotes_count” (SQL: select , (select count() from where . = . and . = App\Post >),upvotesupvotesupvoteable_idpostsidupvotesupvoteable_typeupvotes_countpostsupvotes_count

因此,从我能猜到的是,upvotes_count未被选中,因此找不到该列,但是如果我执行这段代码。

$posts = Post::withCount('upvotes')->get();

然后我得到这个输出。

{
"id": 1,
"user_id": 15,
"title": "Voluptatum voluptas sint delectus unde amet quis.",
"created_at": "2016-10-07 13:47:48",
"updated_at": "2016-10-07 13:47:48",
"upvotes_count": 7
},
{
"id": 2,
"user_id": 2,
"title": "Molestiae in labore qui atque.",
"created_at": "2016-10-07 13:47:48",
"updated_at": "2016-10-07 13:47:48",
"upvotes_count": 2
},

这基本上意味着正在选择upvotes_count,因此我对如何解决这个问题感到非常困惑。

(下面给出了到目前为止我尝试过的更多选项以及与之相关的相应错误。

$posts = Post::where('id', $id)->withCount(['upvotes' => function($query) {
        $query->where('upvotes_count', '>', 5);
    }])->get();

错误。

SQLSTATE[42S22]: 未找到列: 1247 不支持引用“upvotes_count”(项目列表中的前向引用) (SQL: 选择 , (选择 count() 从中 . = . 和 . = App\Post 和 > 5)upvotesupvotesupvoteable_idpostsidupvotesupvoteable_typeupvotes_countupvotes_countpostsid

法典。

$posts = Post::where('id', $id)->with(['upvotes' => function($query) {
        $query->select('upvoteable_id AS upvotes_count');
    }])->where('upvotes_count', '>', 5)->get();

$posts = \App\Post::where('id', $id)->with(['upvotes' => function($query) {
        $query->selectRaw('upvoteable_id AS upvotes_count');
    }])->where('upvotes_count', '>', 5)->get();

错误。

SQLSTATE[42S22]:未找到列:1054 “where 子句”中的未知列“upvotes_count”(SQL:从 where = 1 中选择 * 并> 5)postsidupvotes_count


我只想在与父模型关系中的 count() 方法上使用 where 子句。


答案 1

您可以使用以下命令获得请求的结果:

$posts = Post::withCount('upvotes')
         ->having('upvotes_count', '>', 5)
         ->get();

答案 2

另一种好方法是,我们可以单独过滤,甚至为该列名称分配别名

$posts = Post::withCount([
    'upvotes', 
    'upvotes as upvotes_count' => function ($query) {
        $query->where('upvotes_count', '>', 5);
    }])
    ->get();

现在在刀片中,您可以做到

$posts->upvotes_count

推荐