首页 > 解决方案 > 在 Laravel 中将 SQL 更改为查询生成器

问题描述

这是我的 SQL 语句

SELECT `pams_users`.display_name,`pams_user_levels`.description FROM pams_users 
JOIN pams_developer ON `pams_users`.developer_id=`pams_developer`.id AND `pams_developer`.id=27 OR `pams_users`.`parent_dev`=27
JOIN pams_user_levels ON `pams_user_levels`.id=`pams_users`.user_level AND `pams_user_levels`.id=6
GROUP BY  `pams_users`.display_name   

这是我基于 SQL 的查询生成器

 DB::table('pams_users')
        ->join('pams_developer','pams_developer.id','pams_users.developer_id')
        ->join('pams_user_levels','pams_user_levels.id','pams_users.user_level')
        ->where('pams_developer.id',27)
        ->orWhere('pams_users.parent_dev',27)
        ->where('pams_user_levels.id',6)
        ->select('developer_name','description','display_name')
        ->selectRaw('count(pams_users.id) as count')
        ->groupBy('display_name')
        ->get();

但是,查询生成器没有显示任何错误,而是显示与 SQL 语句不同的结果。
任何人都可以弄清楚我的查询生成器问题吗?
感谢您对我的查询生成器的任何建议和评论。


标签: phpsql

解决方案


问题可能是那里的 Eloquent 查询构建器没有封装 OR WHERE 子句。您可以将闭包传递where()给它来执行此操作,如下所示。

我还将选择分组为单个方法调用,使用 usingDB::raw而不是selectRaw()方法。

DB::table('pams_users')
    ->join('pams_developer','pams_developer.id','pams_users.developer_id')
    ->join('pams_user_levels','pams_user_levels.id','pams_users.user_level')
    ->select([
        'developer_name',
        'description',
        'display_name',
        DB::raw('count(pams_users.id) as count'), // this avoids the separate selectRaw()
    ])
    ->where(function($query) {
        $query->where('pams_developer.id',27)
            ->orWhere('pams_users.parent_dev',27);
    })
    ->where('pams_user_levels.id',6)
    ->groupBy('display_name')
    ->get();

推荐阅读