Как присоединиться к Eloquent и Query Builder в одном запросе в laravel - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 2 запроса, которые необходимо присоединить, 1-й является красноречивым, а 2-й является построителем запросов,

1-й запрос

$products = Product::all();

2-й запрос

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

Какобъединить эти 2 запроса в самый популярный способ?

1 Ответ

2 голосов
/ 30 мая 2019

При использовании построителя запросов создается впечатление, что у вас есть промежуточная таблица, в которой хранится информация о том, какой продукт и какой склад существуют, но если это отношение один ко многим, эта таблица не должна быть, вместо этого в таблице продуктов следуетесть 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;
...