Laravel 5.6 фильтрует родительские строки на основе дочерних

Моя структура базы данных выглядит так (я использую MySQL):

товары:

#------#---------#
| id   | int     |
#------#---------#
| name | varchar |
#------#---------#

продукты_свойства:

#-------------#-----#
| product_id  | int |
#-------------#-----#
| property_id | int |
#-------------#-----#

характеристики:

#-------#---------#
| id    | int     |
#-------#---------#
| name  | varchar |
#-------#---------#
| value | varchar |
#-------#---------#

Можно ли фильтровать объекты продукта по свойствам? Я пытаюсь использовать нетерпеливую загрузку следующим образом:

$products = Product::with(['properties' => function($query){
    $query->where('name', 'testproperty');
}])
->get();

Но при запуске этого кода Eloquent фильтрует только свойства, найденные в каждом продукте, и по-прежнему находит все продукты, даже если ни одно из свойств не соответствует моему адресу. Также красноречивый фильтрует свойства в моем продукте, в то время как я хочу показать все свои свойства.

Мой текущий результат таков:

{
    id: 1,
    name: "test",
    properties: [
        {
            id: 1,
            name: "testproperty",
            value: "testvalue"
        }
    ]
    },
    {
    id: 2,
    name: "test2",
    properties: [

    ]
}

Но я ищу что-то вроде этого:

{
    id: 1,
    name: "test",
    properties: [
        {
            id: 1,
            name: "testproperty",
            value: "testvalue"
        },
        {
            id: 2,
            name: "testproperty2",
            value: "testvalue2"
        }
    ]
    }
}

Можно ли просто отфильтровать родительский класс на основе дочерних объектов (свойств) и при этом получить все свойства, связанные с продуктом?


person Stefan    schedule 09.05.2018    source источник


Ответы (1)


Я думаю, вам нужно whereHas, чтобы проверить дочернюю коллекцию

$product = Product::with('properties')
                  ->whereHas('properties', function ($query) {
                       $query->where('name', '=', 'testproperty');
                 })->where('id', $id)->first();
person M Khalid Junaid    schedule 09.05.2018
comment
Большое спасибо, именно то, что я искал! - person Stefan; 09.05.2018