Laravel使用has()关联查询仍返回空options数组问题排查
问题原因与解决办法
你写的代码里,has('tiers.options')只是保证当前买家至少有一个关联的tiers,且这个tiers存在options,但你在with里的约束只筛选了要加载的options类型,没过滤那些不带符合条件options的tiers。所以最终返回的买家数据里,还是会混进那些没有type='private'选项的tiers,这些tiers的options数组自然是空的。
要解决这个问题,得同时给tiers关联也加上过滤条件,确保加载的每个tiers都带有符合要求的options,修改后的代码如下:
$buyers = Buyer::with([ 'tiers' => function ($query) { // 只保留带有type为private的options的tiers,同时加载对应的options $query->whereHas('options', function ($subQuery) { $subQuery->where('type', 'private'); })->with(['options' => function ($subQuery) { $subQuery->where('type', 'private'); }]); } ]) // 确保买家至少有一个符合条件的tiers ->has('tiers.options', '>', 0) ->get();
或者更简洁的写法,利用嵌套的whereHas和关联约束:
$buyers = Buyer::with(['tiers.options' => function ($query) { $query->where('type', 'private'); }]) // 约束买家必须存在符合条件的options关联 ->whereHas('tiers.options', function ($query) { $query->where('type', 'private'); }) // 过滤掉那些没有有效options的tiers ->with(['tiers' => function ($query) { $query->has('options'); }]) ->get();
总结一下关键逻辑:
whereHas('tiers.options', ...)确保买家本身关联了符合条件的(type=private)options- 在
with('tiers')的闭包里加has('options'),保证每个被加载的tiers都至少有一个符合条件的options,不会出现空数组的情况
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

