laravel morphToMany родительской модели, как использовать в подзапросе? - PullRequest
0 голосов
/ 06 мая 2020

Текущие laravel отношения моделей: ParentModel может иметь много документов, ChildModel может иметь много документов, один и тот же Documents может принадлежать любому из ParentModel и ChildModel. Также ChildModel всегда принадлежит одному ParentModel. ParentModel может иметь несколько ChildModels.

отношений App \ ParentModel

...
public function childmodels()
{
    return $this->hasMany('App\ChildModel');
} 
public function documents() 
{
    return $this->morphToMany('App\Document', 'documentable');
}
...

отношений App \ ChildModel

...
public function parentmodel()
{
    return $this->belongsTo('App\ParentModel');
}
public function documents() 
{
    return $this->morphToMany('App\Document', 'documentable');
}
...

App \ Document

...
public function parentmodels()
{
    return $this->morphedByMany('App\ParentModel','documentable');
}    

public function childmodels()
{
    return $this->morphedByMany('App\ChildModel','documentable');
}
...

Теперь я пытаюсь получить все записи ChildModels (1), которые имеют документы с определенным типом c и (2) его ParentModel также могут иметь документы.

( 1) первая цель может быть достигнута таким методом ChildModel.

/* checking GET param to join this condition to final query */
if($request->has('report') && $request->input('report') == 'on') {

    /* get all documents related to CurrentModel */
    $query->whereHas('documents',function (Builder $query) {
        $query->where('type', 1);
    });        

}

Но это явно не включает записи ChildModels, ParentModel из которых имеет документы с определенным типом c.

Итак, вопрос: как включить такое условие в ChildModel конструктор запросов?

1 Ответ

0 голосов
/ 06 мая 2020

Нашел простой способ доступа к отношениям в конструкторе

$query->whereHas('parentmodels.documents', function(Builder $query){
     $query->where('type',1);
});
...