我有三个表,一个表定了另外两个之间的多对多关系。
table:collections
table:collection_question
表:问题
我正在运行此查询以返回集合的问题数
$results = DB::table('collections')
->select(array(
DB::raw('count(collection_question.question_id) as question_count'),
'name',
'description'
))->leftJoin(
'collection_question',
'collections.id',
'=',
'collection_question.collection_id'
)->where('question_count', '>', 1)
->orderBy('question_count', 'asc')
->get();
这可以正常工作,因为查询构建器不会篡改选择查询。
当我为get()
换出count()
时,查询构建器会用select count(*) as aggregate
替换我的select子句,这是可以理解的,但是在此过程中我放松了与question_count
的绑定并抛出SQL异常。
我已查看Illuminate\Database\Query\Builder
的源代码,尝试找到解决方案,但除了使用自定义count(*)
手动执行原始查询以及我的其他选择条款之外我有点失落。
有人能找到解决方案吗?
答案 0 :(得分:0)
我没有在count()
对象上调用Builder
,除了替换查询上的任何其他select子句外,我还使用了创建自己的count表达式而不是替换它们。
// This is in a class that uses Illuminate\Database\Query\Expression the clone
// isn't necessary in most instances but for my case I needed to take a snapshot
// of the query in its current state and then manipulate it further.
$query = clone($query);
$query->addSelect(new Expression("count(*) as aggregate"));
$count = (int) $query->first()->aggregate;