【问题标题】:Query Laravel relations, products, storehouses and sales查询 Laravel 关系、产品、仓库和销售额
【发布时间】:2021-01-20 05:34:33
【问题描述】:

我正在使用 Laravel 管理不同仓库中的产品和销售,有四个表:products、storehouses、sales 和 saleItems,简化后看起来像这样:

Storhouse ID、地址、...

产品 ID、名称、...

销售 id, store_id, ...

SaleItems id, product_id, sale_id, qty, ...

问题是如何获取每个仓库中每个产品的产品列表和销售计数,有人知道如何做到这一点吗?

以下是模型:

class Product extends Model 
{
    public function sales(){
      return $this->hasMany('App\Models\SaleItem');
    }
}

class Sale extends Model
{
  public function storehouse(){
    return $this->belongsTo('App\Models\Storehouse');
  }
  public function items(){
    return $this->hasMany('App\Models\Saleitem');
  }
}

class SaleItem extends Model
{
  public function sale(){
    return $this->belongsTo('App\Models\Sale');
  }
  public function product(){
    return $this->belongsTo('App\Models\Product');
  }
}

class Storehouse extends Model
{
  public function sales() {
    return $this->hasMany('App\Models\Sale');
  }
}

【问题讨论】:

  • 产品列表?此列表是否需要属于特定的仓库?
  • 是的,每个仓库的销售计数或总和的产品列表:/

标签: php laravel eloquent


【解决方案1】:

Eloquent 对于管理和查询基本关系非常有用,但它在用于包含各种分组、聚合器等的复杂查询时会变得更加棘手。在这种情况下,我建议执行实际的 sql 查询:

SELECT P.id, P.name, SH.id, sum(SI.qty) as quantity
FROM products as P 
JOIN sale_items as SI on SI.product_id = P.id
JOIN sale as S on SI.sale = S.id
JOIN store_houses as SH on store_houses.id = S.store_id
GROUP BY P.id, SH.id

你可以像这样在 laravel 中使用:

$result = DB::select('SELECT P.id, P.name, SH.id, sum(SI.qty) as quantity
FROM products as P 
JOIN sale_items as SI on SI.product_id = P.id
JOIN sale as S on SI.sale = S.id
JOIN store_houses as SH on store_houses.id = S.store_id
GROUP BY P.id, SH.id');

【讨论】:

  • 谢谢,我试试看:)
  • 我已经在你的代码下面发布了一个修改版本,它工作正常,但输出仍然不是很好用,你看看。
  • 我赞成您的回复,我想出了如何使其适应我的需求。谢谢。
【解决方案2】:

@gbalduzzi,感谢您的快速解决方案,您说得对,经典的 sql 查询是可行的方法,我已经修复了一些命名问题,现在可以使用,但是缺少产品信息,我没有认为结果是正确的:/

$data = DB::select('SELECT P.id, P.name, SH.id, SH.name, sum(SI.qty) as sales
        FROM products as P 
        JOIN sale_items as SI on SI.product_id = P.id
        JOIN sales as S on SI.sale_id = S.id
        JOIN storehouses as SH on SH.id = S.storehouse_id
        GROUP BY P.id, SH.id');

还有其他问题,这里的id是那个

    [
      {
    "id": 1,
    "name": "Storehouse 01",
    "sales": "5.00"
  },
  {
    "id": 2,
    "name": "Storehouse 02",
    "sales": "8.00"
  },
  {
    "id": 1,
    "name": "Storehouse 01",
    "sales": "9.00"
  },
  {
    "id": 2,
    "name": "Storehouse 02",
    "sales": "6.00"
  },
  {
    "id": 1,
    "name": "Storehouse 01",
    "sales": "15.00"
  } ... ]

【讨论】:

  • 结果中有两列名为 id 和两列名为 name,因此它们会被覆盖。试试SELECT P.id as prod_id, P.name as prod_name, SH.id as storehouse_id, SH.name as storehouse_name , sum(SI.qty) as sales
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多