У меня есть следующие отношения в базе данных, каждая таблица со своей соответствующей и связанной моделью.
У меня есть продукты, где каждый продукт имеет свой рецепт, который состоит из нуля или более элементов и необходимого количества.
После этого у меня есть складская таблица, где у меня есть текущий запас элемента, и я хочу получить продукты, в которых количество, необходимое в рецепте, меньше запаса.
Как я могу получить эти данные? мне пришло в голову создать область в модельных продуктах, но я не знаю, как выполнить проверку, так как они могут быть 0 или n элементов в рецепте?
контроллер
Product::with('recipe')
->enableElements()->get();
Модельный продукт
public function scopeEnableElements($query)
{
}
Вы можете запросить от Recipe
в WareHouse
связывая element_id
,
Рецепт модели:
public function warehouses()
{
return $this->hasMany(\App\Models\WareHouse::class, 'element_id', 'element_id');
}
Модель WareHouse:
public function recipes()
{
return $this->hasMany(\App\Models\Recipe::class, 'element_id', 'element_id');
}
Код контроллера:
Product::whereHas('recipes', function($q) {
$q->whereHas('warehouses', function($query) {
$query->whereRaw('WareHouse.stock > Recipe.count'); // use table names here, not model names
});
})->get();
Если вы хотите сделать это с областью в модели рецепта:
public function scopeEnableElements($query)
{
$query->whereHas('warehouses', function($query2) {
$query2->whereRaw('WareHouse.stock > Recipe.count'); // use table names here, not model names
});
}
Тогда в вашем контроллере:
Product::whereHas('recipes', function($query) {
$query->enableElements();
})->get();
Других решений пока нет …