Как получить продукты, когда отношения соответствуют условию Laravel Eloquent - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующие отношения в базе данных, каждая таблица со своей соответствующей и связанной моделью.

enter image description here

У меня есть продукты, где у каждого продукта есть свой рецепт, который состоит из нуля или более элементов и необходимого количества.

После этого у меня есть складская таблица, где у меня есть текущий запас элемента, и я хочу получить продукты, в которых количество, необходимое в рецепте, меньше, чем запас.

Как я могу получить эти данные? мне пришло в голову создать область действия в модельных продуктах, но я не знаю, как выполнить проверку, поскольку в рецепте может быть 0 или n элементов?

Контроллер

Product::with('recipe')
            ->enableElements()->get();

Модель товара

public function scopeEnableElements($query)
{

}

1 Ответ

0 голосов
/ 11 ноября 2018

Вы можете запросить от 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...