Laravel中统计特定用户关联商家的缺货商品总数及库存总价值实现方案求助
解决方案:获取特定用户商家的商品并统计缺货数据
没问题,我来帮你搞定这个需求!首先咱们得先明确关联关系——我假设你的Business表有user_id字段(用来关联创建商家的用户),先把模型关联定义好,再实现查询统计逻辑。
第一步:定义模型关联
如果还没给模型加关联的话,先补上:
User 模型(app/Models/User.php)
public function businesses() { // 一个用户可能拥有多个商家,用hasMany;如果是一个用户对应一个商家,改成hasOne即可 return $this->hasMany(Business::class); }
Business 模型(app/Models/Business.php)
public function items() { return $this->hasMany(Item::class); }
Item 模型(app/Models/Item.php)
public function business() { return $this->belongsTo(Business::class); }
第二步:实现查询与统计逻辑
这里提供两种方案,你可以根据业务场景选:
方案一:一次查询获取所有数据(推荐)
这个方案用Eloquent关联和子查询,一次数据库请求就能拿到用户的所有商家商品、缺货商品总数、缺货商品的库存总价值,避免N+1问题:
$targetUserId = 123; // 替换成你要查询的用户ID $userData = User::with(['businesses.items' => function ($query) { // 只选择需要的字段,优化性能 $query->select('id', 'name', 'price', 'selling_price', 'quantity_in_stock', 'business_id'); }]) ->withCount([ // 统计该用户所有商家下库存为0的商品总数 'businesses.items as out_of_stock_count' => function ($query) { $query->where('quantity_in_stock', 0); } ]) ->selectRaw(' users.*, // 计算缺货商品的库存总价值(这里用price*quantity_in_stock,库存为0的话结果是0,如果你要的是商品本身的总价值,改成SUM(price)即可) (SELECT SUM(price * quantity_in_stock) FROM items JOIN businesses ON items.business_id = businesses.id WHERE businesses.user_id = users.id AND items.quantity_in_stock = 0) AS out_of_stock_total_value ') ->find($targetUserId); // 使用示例: $outOfStockCount = $userData->out_of_stock_count; $outOfStockTotalValue = $userData->out_of_stock_total_value; $allItems = $userData->businesses->flatMap(fn($biz) => $biz->items); // 扁平化获取所有商品
注意:如果
out_of_stock_total_value需要的是缺货商品的总售价,把price换成selling_price就行;如果是指商品本身的总价值(比如补货成本),直接用SUM(price)即可,根据你的业务需求调整。
方案二:分开查询商品列表和统计数据
如果你的业务不需要把用户信息和统计数据绑定在一起,也可以分开查询:
$targetUserId = 123; // 获取该用户所有商家下的商品列表 $userItems = Item::whereHas('business', function ($query) use ($targetUserId) { $query->where('user_id', $targetUserId); })->get(); // 统计缺货数据 $stockStats = Item::whereHas('business', function ($query) use ($targetUserId) { $query->where('user_id', $targetUserId); }) ->where('quantity_in_stock', 0) ->selectRaw('COUNT(*) as out_of_stock_count, SUM(price * quantity_in_stock) as out_of_stock_total_value') ->first(); // 使用示例: $outOfStockCount = $stockStats->out_of_stock_count; $outOfStockTotalValue = $stockStats->out_of_stock_total_value;
注意要点
- 确保
Business表存在user_id字段,并且已经建立和users表的外键关联(如果需要的话) - 如果用户只有一个商家,可以把
User模型里的hasMany(Business::class)改成hasOne(Business::class),查询逻辑也能简化不少 - 尽量选择方案一,减少数据库请求次数,提升性能
- 别忘了处理
quantity_in_stock为nullable的情况,比如如果要把null也视为缺货,查询时加上whereIn('quantity_in_stock', [0, null])即可
内容的提问来源于stack exchange,提问作者Caleb Bala
相关产品推荐
相关产品推荐

