繁体   English   中英

使用查询生成器选择中的Laravel子查询

[英]Laravel Sub queries in select using query builder

我想使用查询生成器获取此查询:

SELECT *, 
(    SELECT sum(vendor_quantity) 
     from inventory 
     WHERE product_id = products.id
) as qty from products

我坚持这部分

(SELECT sum(vendor_quantity) from inventory where product_id = products.id)

我可以使用原始查询来执行此操作,但是我想知道是否可以在查询生成器中执行此操作。

我的产品表架构:

Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_type',50);
            $table->string('product_name',255);
            $table->string('internal_reference',255);
            $table->string('barcode',255);
            $table->decimal('sale_price', 10, 2);
            $table->decimal('cost', 10, 2);
            $table->decimal('weight', 10, 2);
            $table->decimal('volume', 10, 2);
            $table->integer('added_by')->unsigned();
            $table->timestamps();
        });
// Foreign Keys
Schema::table('products', function(Blueprint $table) {
  $table->foreign('added_by')->references('id')->on('users');
});

库存表:

Schema::create('stocks', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('product_id')->unsigned();
            $table->integer('vendor')->unsigned();
            $table->string('vendor_product_code',255);
            $table->string('vendor_product_name',255);
            $table->integer('vendor_quantity');
            $table->decimal('vendor_price', 10, 2);
            $table->date('vendor_produce');
            $table->date('vendor_expiry');
            $table->integer('added_by')->unsigned();
            $table->timestamps();
        });
    // Foreign Keys
    Schema::table('stocks', function(Blueprint $table) {
       $table->foreign('product_id')->references('id')->on('products');
       $table->foreign('vendor')->references('id')->on('customers');
       $table->foreign('added_by')->references('id')->on('users');
    });

您可以只添加所需的输出内容吗? 就像您打算提出的建议一样,我可以为您提供出色的设置。 从上面的迁移看来,您似乎缺少了一些表格,例如“库存”。

以任何方式-您首先需要在模型之间建立雄辩的关系。 对于上面的两个,是这样的:

class Stock extends Model{

    public function product(){
        return $this->belongsTo(Product::class);
    }

}

class Product extends Model{

    public function stock(){
        return $this->hasMany(Stock::class);
    }

}

现在,您的总和让我有些困惑...由于vendor_quantity是您的库存表中的一列...您是否需要从库存表中获取所有产品和相应的外键值,然后将所有值求和在vendor_quantity中? 如果是这种情况,请执行以下操作:

$products = Products::with('stock')->get();

这将从库存表中返回您所有产品和外键值的雄辩的集合。 由于您具有相关表中的值,因此您可以遍历每个表中的值,将其添加到变量中,或仅将其附加到初始对象以传递到视图。 例如

$products = Product::with('stock')->get();

    foreach ($products as $key => $product){

        $vendorQuantitySum = $product->stock->sum('vendor_quantity');

        $products[$key]->vendorQuantity = $vendorQuantitySum;

    }

现在,当您将$ products传递到视图时,您可以轻松地在视图中获得总和,如下所示:

{{ $product->vendorQuantity }}

我刚刚在Laravel安装上对其进行了测试,它似乎可以正常工作:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM