在Eloquent ORM中使用COUNT()函数(在Laravel之外)

时间:2015-01-16 03:01:19

标签: php laravel eloquent

我尝试使用Eloquent ORM复制SQL查询:

SELECT DISTINCT name, COUNT(name) AS total
FROM tags
WHERE question_id IS NOT NULL
GROUP BY name
ORDER BY name ASC;

这是我在Eloquent ORM中的尝试:

$query = Tag::query();
$query->orderBy('name', 'asc');
    ->groupBy('name');
    ->select( array('count(name) as total') );
    ->whereNotNull('question_id');

然而,这给了我以下错误:

  

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'count(name)' in 'field list' (SQL: SELECT COUNT(名称)ASFROM代码WHERE代码. deleted_at IS NULL AND question_id IS NOT NULL GROUP BY名称{{ 1}} {名称{1}}

......很明显我没有正确使用它。

我发现一条帖子说我应该使用ORDER BY,但我不知道DB类在哪里,因为我没在Laravel工作。如果我需要使用它,我怎么能在Laravel之外使用它。我为两者尝试了ASC)

DB::raw('COUNT(name) as total')

...,因为这些是唯一的类,使用grep,我可以找到一个公共'函数raw'在他们里面。 Query / Builder给了我一个错误,Connection运行正常,但也许我没有正确构建查询对象,因为它给我在MySQL shell中运行SQL的结果不一致。有点儿死了,有人可以提供任何帮助吗?

由于

2 个答案:

答案 0 :(得分:1)

这有效,但不确定它是否是最干净的方式:$query->selectRaw('DISTINCT name, COUNT(name) as total')

答案 1 :(得分:0)

要实现您的目标,如果您使用的是Laravel 4.1.x,则可以使用此类Eloquent同时使用DB::use Illuminate\Database\DatabaseManager;查询

在您的文件顶部

use Illuminate\Database\DatabaseManager;

在您的类(控制器或其他任何东西)中注入依赖项是一种很好的做法

/**
 * @var DatabaseManager
 */
private $databaseManager;

/**
 * @param DatabaseManager        $databaseManager
 */
public function __construct(DatabaseManager $databaseManager)
{
    $this->databaseManager = $databaseManager;
}

然后在您的方法中,我只是假设您的表名和字段在这里......

 public function youAwesomeMethod(){
    $query = Tag::select([
        'tags.id',
        'tags.name',
        $this->databaseManager->raw("count(tags.id) AS count_tags")
    ])->whereNotNull('tags.question_id')
      ->orderBy('tags.name', 'ASC')
      ->groupBy('count_tags');
    // Do something else if needed
    return $query
}

这应该可以解决问题。您还可以访问count_tags作为正常的Eloquent属性tag->count_tags