Laravel: красноречивые результаты возвращаются только в том случае, если отношение и отношение внутри этого отношения существуют - PullRequest
1 голос
/ 06 августа 2020

У меня три модели: ProductType, ProductSubtype и ProductSubtypeCategory

ProductType. php

class ProductType extends Model{
    // A product type has many subtypes
    public function product_subtypes(){
        return $this->hasMany(ProductSubtype::class);
    }
}

ProductSubtype. php

class ProductSubtype extends Model{
    // Each product subtype belongs to a type
    public function product_type(){
        return $this->belongsTo(ProductType::class);
    }
    // A product subtype has many categories
    public function product_subtype_categories(){
        return $this->hasMany(ProductSubtypeCategory::class);
    }
}

ProductSubtypeCategory. php

class ProductSubtypeCategory extends Model{    
    // Each cateogory belongs to a subtype
    public function product_subtype(){
        return $this->belongsTo(ProductSubtype::class);
    }
}

Мне нужны только типы продуктов, в которых подтип (-ы) продукта (-ы) и подтип (-ы) категории (-ей) в этом подтипе существует. До сих пор я пробовал это

return ProductType::has('product_subtypes', function ($query){
            $query->has('product_subtype_categories');
        })->get();

Есть ли какой-либо официальный способ получить желаемые результаты от таких вложенных отношений?

1 Ответ

1 голос
/ 06 августа 2020

То, что вы делаете, правильно, но можно упростить.

Измените следующее:

return ProductType::has('product_subtypes', function ($query){
    $query->has('product_subtype_categories');
})->get();

на:

return ProductType::has('product_subtypes.product_subtype_categories')->get();

Из docs :

При доступе к записям для модели вы можете sh ограничить свои результаты на основании наличия связи. Например, представьте, что вы хотите получить все сообщения блога, содержащие хотя бы один комментарий. Для этого вы можете передать имя отношения методам has и orHas:

// Retrieve all posts that have at least one comment...
$posts = App\Post::has('comments')->get();

Вложенные операторы has также могут быть созданы с использованием "точки "обозначение. Например, вы можете получить все сообщения, в которых есть хотя бы один комментарий и голосование:

// Retrieve posts that have at least one comment with votes...
$posts = App\Post::has('comments.votes')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...