You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel两表组合查询:筛选无对应variant关联的product_types_values记录

两种方式都可实现,你可以根据业务场景选择即可:

方案1:基于现有变量直接处理(适合数据量小、且$variants已查询全量数据的场景)

注意:你当前代码中的$variants是paginate(10)分页查询结果,只能获取到当前页的10条数据,如果直接用该变量提取value做筛选,会因为数据不全导致筛选结果错误。如果你的业务场景本身就只需要基于当前页的variant做筛选,或者你把paginate(10)改成get()获取全量variant,可以用这个方案。

实现代码如下:

// 提取所有variant的value转为数组
$existVariantValues = $variants->pluck('value')->toArray();

// 筛选符合条件的product_types_values记录
$targetPtv = $products_types_values->filter(function ($ptv) use ($existVariantValues) {
    return !in_array($ptv->value, $existVariantValues);
});

方案2:直接编写新的查询语句(更推荐,性能更高,避免分页坑)

如果你的$variants只是为了筛选ptv才查询,或者你需要基于全量variant数据筛选,直接用Eloquent子查询实现即可,不需要把全量数据拿到PHP层处理,数据库层面直接筛选效率更高,代码如下:

$targetPtv = ProductTypeValue::where('type_id', $product->type_id)
    ->whereNotIn('value', function ($query) use ($id) {
        $query->select('value')
            ->from('variants')
            ->where('id_type', 1) // 若id_type为动态值可替换为对应变量
            ->where('id_product', $id);
    })
    ->orderBy('value', 'asc')
    ->get();

如果你的页面其他逻辑还需要用到分页的$variants做展示,原来的$variants查询可以保留,和上面的筛选查询互不影响。


内容的提问来源于stack exchange,提问作者martibellot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:15:03