Laravel 5.2 orderBy与withCount的关系由于尝试获取列而不是计数失败而导致SQL错误

时间:2018-08-30 09:03:28

标签: laravel laravel-5.2

目标是按过滤条件中的视图对广告系列进行排序,这就是为什么我有一个与广告系列相关的分析表的原因

我的广告系列模型(数据库名称为“ ads”):

public function views() {
    return $this->hasMany('App\Analytic', 'foreign_id', 'id')->where('foreign_type', '=', 'campaign');
}

我过滤的控制者:

$query = Ad::withCount('views')->with('tags');
$query->where("is_active", "=", 1);
$query->where("status", "=", 1);
$query->orderBy('views_count', 'DESC');
$campaigns = $query->get();

现在不使用$ query->部分而不编写它的原因是因为查询中有很多if语句,具体取决于过滤设置。

错误消息正在显示

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'views_count' in 'order clause' (SQL: select count(*) as aggregate from `ads` where `is_active` = 1 and `status` = 1 and `from_year` >= 7 and `to_year` <= 88 and `price` >= 1000 and `price` <= 64000 order by `views_count` desc) 

错误是它试图获取列,但我不知道原因。 如果我尝试访问刀片服务器模板中的$campaign->views_count,则显示计数很好。

谢谢您的时间,我希望有人可以告诉我我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

您得到的错误是count()方法而不是get()的结果。 像这样

$query = Ad::withCount('views')->with('tags');
$query->where("is_active", "=", 1);
$query->where("status", "=", 1);
$query->orderBy('views_count', 'DESC');
$campaignCount = $query->count();

wich将复杂的选择部分替换为:

select count(*) as aggregate

如果您需要count()和get(),请按照以下步骤操作:

$query = Ad::withCount('views')->with('tags');
$query->where("is_active", "=", 1);
$query->where("status", "=", 1);
$campaignCount = $query->count();

$query->orderBy('views_count', 'DESC');
$campaigns = $query->get();