【问题标题】:Laravel query builder, use custom select when calling count()Laravel 查询生成器,调用 count() 时使用自定义选择
【发布时间】:2014-07-13 15:18:07
【问题描述】:

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

表:集合

表: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 子句替换为select count(*) as aggregate,这是可以理解的,但是我在此过程中松开了与question_count 的绑定,并引发了SQL 异常。

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

谁能找到解决办法?

【问题讨论】:

    标签: php mysql laravel laravel-4


    【解决方案1】:

    我没有在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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 2016-04-27
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多