Laravel查询生成器,在调用count()时使用自定义选择


Laravel query builder, use custom select when calling count()

我有三个表,一个表定义了另外两个表之间的多对多关系。

table: collections

表:collection_question

table: questions

我正在运行此查询以返回集合具有的问题数

$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替换我的选择子句,这是可以理解的,但是我在过程中失去了对question_count的绑定,并抛出SQL异常。

我已经查看了Illuminate'Database'Query'Builder的源代码,试图找到一个解决方案,但除了手动执行自定义count(*)以及我的其他选择子句的原始查询外,我有点不知所措。

有人能找到解决这个问题的办法吗?

不是在Builder对象上调用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;