如果要执行复杂的查询,laravel提供了查询生成器工具,则可以使用DB外观上的表方法来开始查询。
在你的控制器,你就必须添加以下行使用DB门面:
use Illuminate\Support\Facades\DB;
要执行的查询将被修建这样的:
$query = DB::table('vehicle_colour_and_trims')
->join('colours', 'vehicle_colour_and_trims.colour_id', '=','colours.id')
->join('vehicle_options', 'colours.option_id', '=','vehicle_options.option_id')
->select('colours.id AS id',
'colours.description AS description',
'vehicle_colour_and_trims.colour_id AS colour_id',
'colours.code AS code',
'vehicle_options.basic_price AS basic_price',
'vehicle_options.mrp AS mrp',
'vehicle_options.vat AS vat')
->where('vehicle_colour_and_trims.vehicle_id','=', 116922)
->groupBy('colours.code')
->orderBy('colours.description', 'desc')
->get();
你可以阅读更多关于laravel文档中的查询生成器的信息
https://laravel.com/docs/5.5/queries
使用此查询会出现SQLSTATE [42000]错误,因为在mysql中默认启用了sql_mode = ONLY_FULL_GROUP_BY **,这意味着MySQL会拒绝选择列表,HAVING条件或ORDER BY引用非聚合列的查询没有在GROUP BY子句中命名或在功能上依赖于它们。
为了添加到选择列表列,而无需将其添加到GROUP_BY条款,你必须使用的函数ANY_VALUE()为每个不必存在的子句中的列的,试试这个:
$query = DB::table('vehicle_colour_and_trims')
->join('colours', 'vehicle_colour_and_trims.colour_id', '=','colours.id')
->join('vehicle_options', 'colours.option_id', '=','vehicle_options.option_id')
->select(DB::raw('ANY_VALUE(colours.id) AS id,
ANY_VALUE(colours.description) AS description,
ANY_VALUE(vehicle_colour_and_trims.colour_id) AS colour_id,
colours.code AS code,
ANY_VALUE(vehicle_options.basic_price) AS basic_price,
ANY_VALUE(vehicle_options.mrp) AS mrp,
ANY_VALUE(vehicle_options.vat) AS vat'))
->where('vehicle_colour_and_trims.vehicle_id','=', 116922)
->groupBy('colours.code')
->orderBy('colours.description', 'desc')
->get();
的DB ::原始()函数允许您创建原始表达式
更多信息:
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
不确定为什么你需要一个没有聚合的组。 – xQbert
你会得到错误吗?你不期望的结果? – Randy
在没有任何聚合函数的情况下,您的GROUP BY子句可能会返回错误和/或意外(即不确定)结果。另外,什么是'增值税'? – Strawberry