I am trying to do a where clause on withCount method of laravel's eloquent query builder using this piece of code.
$posts = Post::withCount('upvotes')->where('upvotes_count', '>', 5)->get();
and this code is giving me this error.
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'upvotes_count' in 'where clause' (SQL: select , (select count() from
upvotes
whereupvotes
.upvoteable_id
=posts
.id
andupvotes
.upvoteable_type
= App\Post) asupvotes_count
fromposts
whereupvotes_count
> 5)
So from what I can guess is that upvotes_count isn't selected and hence the column is not being found, BUT if I execute this piece of code.
$posts = Post::withCount('upvotes')->get();
Then I am getting this output.
{
"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
},
Which basically means that upvotes_count is being selected, hence i am really confused about how to solve this problem.
(More options that I tried so far are given below with the respective error associated to it.)
$posts = Post::where('id', $id)->withCount(['upvotes' => function($query) {
$query->where('upvotes_count', '>', 5);
}])->get();
error.
SQLSTATE[42S22]: Column not found: 1247 Reference 'upvotes_count' not supported (forward reference in item list) (SQL: select , (select count() from
upvotes
whereupvotes
.upvoteable_id
=posts
.id
andupvotes
.upvoteable_type
= App\Post andupvotes_count
> 5) asupvotes_count
fromposts
whereid
= 1)
code.
$posts = Post::where('id', $id)->with(['upvotes' => function($query) {
$query->select('upvoteable_id AS upvotes_count');
}])->where('upvotes_count', '>', 5)->get();
AND
$posts = \App\Post::where('id', $id)->with(['upvotes' => function($query) {
$query->selectRaw('upvoteable_id AS upvotes_count');
}])->where('upvotes_count', '>', 5)->get();
error.
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'upvotes_count' in 'where clause' (SQL: select * from
posts
whereid
= 1 andupvotes_count
> 5)
I just want to use where clause on a count() method which is in a relationship with a parent model.
I think using has() is the best solution:
You could also use a filter:
You could also disable strict mode in config/database.php (probably not a good idea)
You could also try to add a groupBy clause (using having in strict mode), but this will likely require you to include every column in your table (due to 'ONLY_FULL_GROUP_BY'), which could break things if you ever add another column to your table, and probably won't work anyway because I think you need to include 'upvotes_count' in the groupBy and it seems to be a non grouping field.
You can achieve requested result by using:
another good way to do this we can filter that separately and even assign an alias to that column name
Now in blade you can do
I'm not sure if this was implemented after your question, but you can now do it like this
If you need to select only rows that the counter is greater than or equal to 1 you can try the follow code:
I don't know if this is the best solution but it's an alternative. Another alternative would be get the posts and use array filter as mentioned in a comment above.
I ran into the same problem, and tried the same things you did. I'm guessing there is a way to replicate the SQL generated by the withCounts call but add a way to make xxx_counts available to a where clause, but I just filtered the resulting collection instead.