【问题标题】:Laravel: how to express HAVING COUNT in eloquentLaravel:如何用 eloquent 表达 HAVING COUNT
【发布时间】:2014-10-20 09:38:20
【问题描述】:

如何在 Laravel 中表达这个查询?

SELECT `projects_issues`.* FROM `projects_issues` 

 JOIN `projects_issues_tags` 
    ON `projects_issues_tags`.`issue_id` = `projects_issues`.`id` 

 JOIN `tags` 
    ON (`tags`.`id`  = `projects_issues_tags`.`tag_id`) 

WHERE `project_id` = '1' 
AND `tags`.`tag` IN('tagname1','tagname2')

GROUP BY `projects_issues`.`id` 
HAVING COUNT(DISTINCT `tags`.`tag`) = 2

ORDER BY `projects_issues`.`updated_at` DESC

现在我的代码是这样的。 `

$issues = \Project\Issue::with('tags');

        if ($tags || $sort_by != 'updated')
        {
            $issues = $issues
                ->join('projects_issues_tags', 'projects_issues_tags.issue_id', '=', 'projects_issues.id')
                ->join('tags', 'tags.id', '=', 'projects_issues_tags.tag_id');
        }

        $issues = $issues->where('project_id', '=', Project::current()->id);

        if ($tags)
        {
            $tags_collection = explode(',', $tags);
            $tags_amount = count($tags_collection);

            $issues = $issues->where_in('tags.tag', $tags_collection);//->get();
        }

        $issues = $issues
            ->group_by('projects_issues.id')
            ->order_by($sort_by_clause, $sort_order);

        if($tags && $tags_amount>1){
            $issues = $issues->having('count', '=', $tags_amount);
        }

        $issues = $issues->get(array('projects_issues.*'));

返回此错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'count' in 'having clause'

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

    使用havingRaw:

    $issues = $issues->havingRaw("COUNT(DISTINCT `tags`.`tag`) = ".$tags_amount);
    

    【讨论】:

    • 方法 Illuminate\Database\Query\Builder::haveRow 不存在
    • 附带说明,如果您要传递一个可能来自用户的变量,则最好使用 havingRaw 允许的参数绑定功能作为第二个参数。
    【解决方案2】:

    找到答案了。

    在 Laravel 3 中:

    $issues = $issues->having(DB::raw('COUNT(DISTINCT `tags`.`tag`)'),'=',$tags_amount);
    

    我怀疑@voodoo417 答案适用于 Laravel 4。

    【讨论】:

    • 两者都在 L4 中工作,但是这个也是安全的 - $tags_amount 绑定在 PDO 中,而在 voodoo417 中则不是。
    • @Jarek Tkaczyk deczo $tags_amount = count($tags_collection);secure?
    • @voodoo417 再次阅读评论 - 这不是关于你做了什么来确保它的安全,而是 Laravel 为你做了什么。使用havingRaw 只是意味着,传递的变量不会被绑定在 PDO 语句中。
    猜你喜欢
    • 2019-07-08
    • 2021-09-08
    • 2017-02-22
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2017-02-04
    相关资源
    最近更新 更多