Laravel 有很多深层次的问题

Oth*_*ane 2 laravel eloquent laravel-8

我已经实现了这种关系,其中仓库属于许多具有许多销售的产品。

我的模型就像

仓库.php

public function products () {
    return $this->belongsToMany(Product::class)->withPivot('quantity');
}
Run Code Online (Sandbox Code Playgroud)

产品.php

public function sales () {
    return $this->hasMany(Sale::class);
}
Run Code Online (Sandbox Code Playgroud)

我想直接从我的仓库模型访问销售,以对销售表中的列进行求和。

我使用了 staudenmeir 的GitHub包,并sales在我的 Warehouse 模型中添加了一个方法。

public function sales () {
    return $this->hasManyDeep(Sale::class, ['product_warehouse', Product::class]);
}
Run Code Online (Sandbox Code Playgroud)

我想做的基本上是对销售表的总列进行求和,所以我withSum()在我的 WarehouseController 中添加了一个方法,如下所示

return Warehouse::query()
        ->withSum('sales', 'total')
        ->get();
Run Code Online (Sandbox Code Playgroud)

结果

[
   {
      "id": 1,
      "warehouse": "Algeria",
      "sales_sum_total": "1000"
   },
   {
      "id": 2,
      "warehouse": "India",
      "sales_sum_total": "1000"
   }
]
Run Code Online (Sandbox Code Playgroud)

这里的问题是,当我向印度仓库添加新销售时,它会为所有仓库返回相同的值。我认为我没有以hasManyDeep()正确的方式使用该方法,或者它可能不适用于我的用例。我能做些什么来让它发挥作用吗?

编辑:我的数据库结构

    Schema::create('warehouses', function (Blueprint $table) {
        $table->id();
        $table->string('warehouse');
    });

    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->decimal('price');
    });

    Schema::create('product_warehouse', function (Blueprint $table) {
        $table->id();
        $table->foreignId('product_id')->constrained()->cascadeOnDelete();
        $table->foreignId('warehouse_id')->constrained()->cascadeOnDelete();
        $table->integer('quantity')->default(0);
    });

    Schema::create('sales', function (Blueprint $table) {
        $table->id();
        $table->foreignId('warehouse_id')->constrained()->cascadeOnDelete();
        $table->foreignId('product_id')->constrained()->cascadeOnDelete();
        $table->integer('quantity');
        $table->decimal('total');
    });
Run Code Online (Sandbox Code Playgroud)

Rat*_*bab 7

虽然您warehouse_idsales表中可以将其作为简单hasMany关系处理并调用它sum,但我测试了您的案例并得到了正确的结果,我刚刚在仓库模型上添加了销售关系:

public function sales()
{
    return $this->hasMany(Sale::class);
}
Run Code Online (Sandbox Code Playgroud)

我刚刚做了:

return Warehouse::withSum('sales', 'total')->get();
Run Code Online (Sandbox Code Playgroud)

  • @YasserSebai 我没有投反对票,我也不会。我很感激他的回答,即使它对我不起作用 (4认同)