Laravel关联查询select无法获取images.path字段报不存在错误如何解决
问题原因
Laravel 中使用with()做关联预加载时,会执行两次独立的SQL查询:第一次查询主表products的相关数据,第二次根据第一次查询返回的产品主键批量查询关联表images的数据,再在代码层完成数据关联匹配。因此主查询的select()方法无法直接识别关联表images的字段,才会抛出字段不存在的错误。
解决方案
方案1:调整预加载逻辑,仅提取关联表指定字段(推荐,保留一对多关联结构)
该方案不需要联表,返回结果保持「每个产品对应多个图片」的层级结构,仅需在with()方法中指定关联表要提取的字段即可,注意必须包含关联的外键和两张表的主键,否则无法完成数据匹配,代码调整如下:
try { $products = $this->productRepo->with(['images' => function($query) { // 必须包含关联外键product_id和image表主键id,才能正常匹配关联数据 $query->select('id', 'product_id', 'path'); }]) // 主查询必须包含products表主键id,用于和关联表外键匹配 ->select('products.id', 'products.name', 'products.price') ->where('category_id', $categoryId) ->get(); return response()->json($products, 200); } catch (\Throwable $th) { $messager = $th->getMessage(); return response()->json($messager, 404); }
方案2:手动联表查询
如果需要基于图片表字段做查询筛选,可使用join手动联表,此时可直接在select中指定images.path字段:
try { $products = $this->productRepo->join('images', 'products.id', '=', 'images.product_id') ->select('products.name', 'products.price', 'images.path') ->where('products.category_id', $categoryId) ->get(); return response()->json($products, 200); } catch (\Throwable $th) { $messager = $th->getMessage(); return response()->json($messager, 404); }
注意:该方案下如果1个产品关联多张图片,会返回多条重复的产品数据,每条对应一张图片,可根据业务需求选择。
内容的提问来源于stack exchange,提问作者Phuoc Tran Ngoc
相关产品推荐
相关产品推荐

