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

时间:2014-05-24 09:01:26

标签: php mysql laravel laravel-4

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

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(*)手动执行原始查询以及我的其他选择条款之外我有点失落。

有人能找到解决方案吗?

1 个答案:

答案 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;