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


Using COUNT() function in Eloquent ORM (outside Laravel)

>我正在尝试使用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;

这是我在雄辩的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 计数(名称) AS总数 FROM 标签 WHERE 标签 . deleted_at IS NULL AND question_id IS NOT NULL GROUP BY 名称 ORDER BY 名称 ASC)

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

找到了一个帖子说我应该使用DB::raw('COUNT(name) as total')但我不知道 DB 类在哪里,因为我不在 Laravel 中工作。如果我需要使用它,我如何在 Laravel 之外使用它。我尝试了use两者:

use Illuminate'Database'Connection as DB;
use Illuminate'Database'Query'Builder as DB;

...,因为这些是唯一的类,使用 grep,我可以找到其中有一个公共的"函数原始"。查询/生成器给了我一个错误,连接运行正常,但也许我没有正确构建查询对象,因为它在 MySQL shell 中运行 SQL 时给我提供了不一致的结果。有点死胡同,谁能提供帮助?

谢谢

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

要实现您想要的,您可以使用此类use Illuminate'Database'DatabaseManager;同时使用 EloquentDB::查询,如果您使用的是 Laravel 4.1.x

在您的文件之上

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作为普通的雄辩属性tag->count_tags