如何将指定多表关联原生SQL转换为Laravel Query Builder写法?
解决Laravel Query Builder数组转字符串异常并转换多表关联SQL
为什么会出现「Array to String Conversion Exception」?
你这段代码的问题出在DB::table(['tbl_stock', 'shades'])的用法上:
$stock_info = DB::table(['tbl_stock', 'shades'])->get();
Laravel的table()方法接收数组时,是用来定义表别名的(比如table(['tbl_stock' => 'stock'])表示把tbl_stock表别名为stock),而不是直接传入多个表名。当你直接传多个表名的数组时,Laravel会尝试把数组转换成字符串来处理表名,自然就触发了数组转字符串的异常。
正确转换原生SQL的Query Builder写法
你的原生SQL是四个表的内连接查询,我们需要用join()方法来逐个建立表关联,完全匹配原生SQL的逻辑:
$stock_info = DB::table('tbl_stock') // 关联series表,对应条件 tbl_stock.series_id = series.series_id ->join('series', 'tbl_stock.series_id', '=', 'series.series_id') // 关联series_size表,对应条件 tbl_stock.size_id = series_size.size_id ->join('series_size', 'tbl_stock.size_id', '=', 'series_size.size_id') // 关联tbl_size表,对应条件 tbl_stock.size_id = tbl_size.size_id ->join('tbl_size', 'tbl_stock.size_id', '=', 'tbl_size.size_id') // 选择所有需要的字段,和原生SQL的SELECT部分一致 ->select('tbl_stock.*', 'series.*', 'series_size.*', 'tbl_size.*') ->get();
可选优化:给表加别名简化代码
如果觉得表名太长,可以给每个表设置别名,让代码更简洁:
$stock_info = DB::table('tbl_stock as s') ->join('series as se', 's.series_id', '=', 'se.series_id') ->join('series_size as ss', 's.size_id', '=', 'ss.size_id') ->join('tbl_size as sz', 's.size_id', '=', 'sz.size_id') ->select('s.*', 'se.*', 'ss.*', 'sz.*') ->get();
这样写出来的代码和你的原生SQL逻辑完全一致,而且不会触发任何异常。
内容的提问来源于stack exchange,提问作者Pavan Baddi
相关产品推荐
相关产品推荐

