选择使用查询构建器

时间:2016-07-11 15:00:32

标签: php mysql laravel-5.2 mariadb

我想使用查询构建器获取此查询:

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');
    });

1 个答案:

答案 0 :(得分:1)

你能直接添加你需要的输出吗?就像你打算在你的视野中抛出什么,所以我可以给你雄辩的设置。从上面的迁移看起来你似乎缺少一些像“库存”这样的表。

无论如何 - 首先需要在模型之间建立雄辩的关系。对于上面两个,这样的事情:

DeterminePostPieceIsVisited

class Stock extends Model{

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

}

现在,你的总和让我感到困惑...因为vendor_quantity是你的股票表中的一列......你需要从股票表中获得所有产品和相应的外键值然后求和vendor_quantity中的所有值?如果是这样的话,可以这样做:

class Product extends Model{

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

}

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

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

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

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

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

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

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

    }

我刚刚在我的Laravel安装上测试它,它似乎工作:)