无法使用whereHas时,如何基于元关系过滤数据库返回数据的输出
解决方案
你的代码当前只是筛选出包含指定meta的产品,但并没有修改产品自身的meta集合(依然保留所有meta项)。要实现仅保留meta关系中meta_key等于_manage_stock的项,需要对每个产品的meta集合单独过滤,具体代码如下:
场景1:保留所有产品,但每个产品的meta仅保留符合条件的项
$metaKey = '_manage_stock'; $products = Product::all()->map(function ($product) use ($metaKey) { // 过滤当前产品的meta集合,只留下目标key的项 $product->meta = $product->meta->filter(function ($meta) use ($metaKey) { return $meta->meta_key === $metaKey; }); return $product; });
场景2:仅保留包含目标meta的产品,且每个产品的meta仅保留该目标项
$metaKey = '_manage_stock'; $filteredProducts = Product::all() // 第一步:筛选出存在目标meta的产品 ->filter(function ($product) use ($metaKey) { return $product->meta->contains('meta_key', $metaKey); }) // 第二步:对每个产品的meta集合进行过滤,仅保留目标项 ->map(function ($product) use ($metaKey) { $product->meta = $product->meta->filter(function ($meta) use ($metaKey) { return $meta->meta_key === $metaKey; }); return $product; });
关键说明
Collection::filter()方法会返回一个新的集合,包含所有满足条件的元素,这里用来处理每个产品的meta集合。- 如果不需要保留无目标meta的产品,就结合
filter(筛选产品)和map(过滤meta)两步操作;如果只需处理meta集合,直接用map即可。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

