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

Laravel多表关联含GROUP BY时如何获取随机产品记录

解决Laravel查询构建器随机获取产品记录的问题

你的当前查询存在逻辑冲突:先按seller_registration.id分组,再调用inRandomOrder(),此时的随机是随机筛选卖家而非随机产品(分组会合并同一卖家下的所有产品,仅返回一条)。根据不同需求,调整方案如下:

需求1:随机获取所有符合条件的产品(不限制卖家产品数量)

直接移除分组操作,让inRandomOrder()直接作用于所有产品记录即可。同时优化部分语法使其更符合Laravel规范:

$products = DB::table('product_management')
    ->join('seller_registration','seller_registration.id','product_management.seller_id')
    ->join('seller_package_management','seller_package_management.id','seller_registration.package_taken_name')
    ->where('product_management.product_name', $product_name)
    ->where('product_management.status', 1)
    ->whereNull('product_management.deleted_at')
    ->whereNull('seller_registration.deleted_at')
    ->where('seller_registration.status', 1)
    ->where([
        ['seller_registration.city','like', "%{$city}%"],
        ['seller_registration.seller_type','like', "%{$seller_type}%"]
    ])
    // ->where('seller_package_management.package_type','Paid') // 按需启用该条件
    ->select([
        'seller_registration.id as sid',
        'seller_registration.company_name',
        'seller_registration.seller_name',
        'seller_registration.company_logo',
        'seller_registration.seller_type',
        'seller_registration.phone',
        'seller_registration.city',
        'seller_registration.pincode',
        'seller_registration.category_name',
        'seller_registration.valid_up_to',
        'product_management.id as pid',
        'product_management.product_name',
        'product_management.product_description',
        'product_management.product_image',
        'product_management.approx_price',
        'product_management.current_price',
        'product_management.deals_in',
        'product_management.moq',
        'product_management.product_specification'
    ])
    // ->orderBy('seller_registration.add_on_package','DESC') // 若无需按套餐排序可删除此行
    ->inRandomOrder()
    ->get();

需求2:每个卖家随机返回一条符合条件的产品

如果需要保证每个卖家仅出现一次,且返回的是该卖家下的随机产品,需要用子查询先对每个卖家的产品做随机排序,再分组取第一条:

$products = DB::table(function($query) use ($product_name, $city, $seller_type) {
    $query->from('product_management')
        ->join('seller_registration','seller_registration.id','product_management.seller_id')
        ->join('seller_package_management','seller_package_management.id','seller_registration.package_taken_name')
        ->where('product_management.product_name', $product_name)
        ->where('product_management.status', 1)
        ->whereNull('product_management.deleted_at')
        ->whereNull('seller_registration.deleted_at')
        ->where('seller_registration.status', 1)
        ->where([
            ['seller_registration.city','like', "%{$city}%"],
            ['seller_registration.seller_type','like', "%{$seller_type}%"]
        ])
        // ->where('seller_package_management.package_type','Paid')
        ->selectRaw('*, RAND() as random_order')
        ->orderBy('random_order');
}, 'sub')
->select([
    'seller_registration.id as sid',
    'seller_registration.company_name',
    'seller_registration.seller_name',
    'seller_registration.company_logo',
    'seller_registration.seller_type',
    'seller_registration.phone',
    'seller_registration.city',
    'seller_registration.pincode',
    'seller_registration.category_name',
    'seller_registration.valid_up_to',
    'product_management.id as pid',
    'product_management.product_name',
    'product_management.product_description',
    'product_management.product_image',
    'product_management.approx_price',
    'product_management.current_price',
    'product_management.deals_in',
    'product_management.moq',
    'product_management.product_specification'
])
->groupBy('seller_registration.id')
->orderBy('seller_registration.add_on_package','DESC') // 按需保留
->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:45:41