Laravel 8关联嵌套查询异常:带闭包的with查询无法正常工作
问题原因及解决方法
你遇到的问题核心是:在关联查询的闭包里手动指定字段时,必须包含关联所需的外键字段。
Laravel的关联查询依赖外键来匹配主模型(Customer)和关联模型(Claims)的数据。当你用with(['claims'])不带闭包时,Laravel会自动查询Claims表的所有字段,其中必然包含了关联用的外键(比如customer_id,具体字段名取决于你定义关联时的设置),所以能正常关联并返回数据。
但当你在闭包里只写$q->select('id')时,查询结果里没有外键字段,Laravel找不到主模型和关联模型之间的匹配关系,自然无法把Claims数据关联到对应的Customer上,所以返回的关联数据为空。
解决方法
只需要在select里加上关联的外键字段就行,比如假设你的Claims表外键是customer_id,修改代码如下:
Customer::where('contract_id',$request->contract_id)->with( [ 'claims'=> function ($q){ $q->select('id', 'customer_id'); // 加上外键字段 } ])->get();
这样Laravel就能通过customer_id把Claims数据和对应的Customer关联起来,正常返回关联数据了。
内容的提问来源于stack exchange,提问作者MOAHMMED BOOS
相关产品推荐
相关产品推荐

