如何在laravel中的一条查询语句中加入Eloquent和Query Builder

时间:2019-05-30 06:02:35

标签: php laravel eloquent laravel-query-builder

我有2条需要加入的查询,第一条是雄辩的,第二条是查询生成器,

第一个查询

$products = Product::all();

第二次查询

$inventory = DB::table('product_warehouse')
->where('product_id', $product_id)
->where('warehouse_id', $warehouse_id)
->first();

如何将这两个查询合并成通俗的方式?

1 个答案:

答案 0 :(得分:2)

从查询生成器的用法来看,似乎您有一个中间表来存储仓库存在的产品,但是如果是一对多关系,则不应该具有该表,而应该在products表中有一个warehouse_id,它将引用id表上的warehouses,正如您所说的,关系是一对多的,而不是许多对的。

因此,在您的Warehouse模型中,您可以添加:

public function products()
{
    return $this->hasMany(Product::class);
}

在您的Product模型中:

public function warehouse()
{
    return $this->belongsTo(Warehouse::class);
}

根据您的表名,您可能需要在仓库模型中设置$table来匹配它:

protected $table = 'product_warehouse';

那么您有多种获取方法,其中一种是:

Warehouse::find($warehouse_id)->products;

// or 

Warehouse::with('products')->where('id', $warehouse_id)->get();

// to get the warehouse to which the product belongs to
Product::find($product_id)->warehouse;