繁体   English   中英

在雄辩的ORM中使用COUNT()函数(Laravel外部)

[英]Using COUNT() function in Eloquent ORM (outside Laravel)

我正在尝试使用雄辩的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 COUNT(名称) ASFROM标签WHERE标签. deleted_at IS NULL AND question_id IS NOT NULL GROUP BYORDER 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的唯一类,所以我发现其中包含一个公共的“原始函数”。 Query / Builder给我一个错误,并且Connection运行正常,但是也许我没有正确构建查询对象,因为它给我在MySQL Shell中运行SQL带来的不一致结果。 Kinda陷入僵局,有人可以提供任何帮助吗?

谢谢

这可以工作,但不确定是否是最干净的方法: $query->selectRaw('DISTINCT name, COUNT(name) as total')

要实现您想要的功能,可以使用EloquentDB::查询,使用此类可以use Illuminate\\Database\\DatabaseManager; 如果您使用的是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身份访问tag->count_tags

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM