sla*_*bot 8 php mysql sql laravel eloquent
我正在尝试使用这段代码在laravel的eloquent查询构建器的withCount方法上执行where子句.
$posts = Post::withCount('upvotes')->where('upvotes_count', '>', 5)->get();
Run Code Online (Sandbox Code Playgroud)
这段代码给了我这个错误.
SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'upvotes_count'(SQL:select ,(select
upvoteswhere ()from whereupvotes.upvoteable_id=posts.idandupvotes.upvoteable_type= App\Post)upvotes_countfrompostswhere whereupvotes_count> 5)
所以我可以猜到,没有选择upvotes_count,因此没有找到列,但是如果我执行这段代码.
$posts = Post::withCount('upvotes')->get();
Run Code Online (Sandbox Code Playgroud)
然后我得到这个输出.
{
"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
},
Run Code Online (Sandbox Code Playgroud)
这基本上意味着正在选择upvotes_count,因此我对如何解决这个问题感到很困惑.
(到目前为止我尝试的更多选项在下面给出了与之相关的相应错误.)
$posts = Post::where('id', $id)->withCount(['upvotes' => function($query) {
$query->where('upvotes_count', '>', 5);
}])->get();
Run Code Online (Sandbox Code Playgroud)
错误.
SQLSTATE [42S22]:未找到列:1247引用'upvotes_count'不受支持(项目列表中的转发引用)(SQL:select ,(select count()from
upvoteswhereupvotes.upvoteable_id=posts.idandupvotes.upvoteable_type= App\Post andupvotes_count> 5)upvotes_countfromposts其中id= 1)
码.
$posts = Post::where('id', $id)->with(['upvotes' => function($query) {
$query->select('upvoteable_id AS upvotes_count');
}])->where('upvotes_count', '>', 5)->get();
Run Code Online (Sandbox Code Playgroud)
和
$posts = \App\Post::where('id', $id)->with(['upvotes' => function($query) {
$query->selectRaw('upvoteable_id AS upvotes_count');
}])->where('upvotes_count', '>', 5)->get();
Run Code Online (Sandbox Code Playgroud)
错误.
SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'upvotes_count'(SQL:select*from
postswhereid= 1 andupvotes_count> 5)
我只想在count()方法上使用where子句,该方法与父模型有关系.
小智 15
您可以使用以下方法获得请求结果:
$posts = Post::withCount('upvotes')
->having('upvotes_count', '>', 5)
->get();
Run Code Online (Sandbox Code Playgroud)
You*_*taf 10
另一个好方法,我们可以单独过滤,甚至为该列名分配一个别名
$posts = Post::withCount([
'upvotes',
'upvotes as upvotes_count' => function ($query) {
$query->where('upvotes_count', '>', 5);
}])
->get();
Run Code Online (Sandbox Code Playgroud)
现在在刀片中你可以做
$posts->upvotes_count
Run Code Online (Sandbox Code Playgroud)
小智 7
我不确定这是否在您提出问题后实施,但您现在可以这样做
$posts = Post::has('upvotes','>',5)->get();
Run Code Online (Sandbox Code Playgroud)
我认为使用 has() 是最好的解决方案:
Post::has('upvotes','>',5)->withCount('upvotes')->get()
Run Code Online (Sandbox Code Playgroud)
您还可以使用过滤器:
Post::withCount('upvotes')->get()->filter(function($post) { return $post->upvotes_count > 5; })
Run Code Online (Sandbox Code Playgroud)
您还可以在 config/database.php 中禁用严格模式(可能不是一个好主意)
'strict' => false,
Post::withCount('upvotes')->having('upvotes_count','>',5)->get()
Run Code Online (Sandbox Code Playgroud)
您还可以尝试添加一个 groupBy 子句(在严格模式下使用having),但这可能需要您包含表中的每一列(由于“ONLY_FULL_GROUP_BY”),如果您向表中添加另一列,这可能会破坏事情表,并且可能无论如何都不起作用,因为我认为您需要在 groupBy 中包含“upvotes_count”,并且它似乎是一个非分组字段。