I'm trying to replicate an SQL query with Eloquent ORM:
SELECT DISTINCT name, COUNT(name) AS total
FROM tags
WHERE question_id IS NOT NULL
GROUP BY name
ORDER BY name ASC;
Here is my attempt in Eloquent ORM:
$query = Tag::query();
$query->orderBy('name', 'asc');
->groupBy('name');
->select( array('count(name) as total') );
->whereNotNull('question_id');
However, this gives me the following error:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'count(name)' in 'field list' (SQL: SELECT
COUNT(name)AS
totalFROM
tagsWHERE
tags.
deleted_atIS NULL AND
question_idIS NOT NULL GROUP BY
nameORDER BY
nameASC)
... so clearly I'm not using it properly.
I found a post saying that I should use DB::raw('COUNT(name) as total')
but I don't know where DB class is as I'm not working within Laravel. If I need to use this, how can I use it outside Laravel. I tried use
for both:
use Illuminate\Database\Connection as DB;
use Illuminate\Database\Query\Builder as DB;
..., as these were the only classes, using grep, I could find to have a public 'function raw' within them. Query/Builder gave me an error, and Connection run OK but perhaps I didn't build the query object correctly as it gives me inconsistent results from running SQL in MySQL shell. Kinda hit a dead end, can anyone offer any help?
Thanks
This works, not sure if it's the cleanest way though:
$query->selectRaw('DISTINCT name, COUNT(name) as total')
To achieve what you want you can use both
Eloquent
andDB::
query by use this classuse Illuminate\Database\DatabaseManager;
if you are using Laravel 4.1.xOn top of your file
Is a good practise to inject the dependency in you class (controller or whatever it is)
Then in your method, I'm just assuming your table name and fields here...
This should do the trick. Also you will access to
count_tags
as a normal Eloquent attributetag->count_tags