Как получить доступ к таблице, связанной с сводной таблицей, в которой есть? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть две модели One и Two, связанные через сводную таблицу one_two, которая имеет собственную модель OneTwo с hasOne Three.Теперь я хочу, чтобы все экземпляры One отфильтровывались по значению в Three.Это то, что я пытался, но безуспешно:

$ones = One::with('twos')->whereHas('twos', function ($q) {
    $q->where('threes.value', 'yes');
})->get();

Как это сделать?

Таблица ones: id, field1

Таблица twos: id, field2

Таблица one_two: id, one_id, two_id, pivot_field,

Таблица threes:id, one_two_id, value

Один <=> Два: многие ко многим

Три => OneTwo: один к одному

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Для такого рода вещей я не думаю, что вы можете напрямую использовать отношения на модели Pivot из-за того, что laravel структурирует многие из многих запросов.

Одним из способов обойти это было бы определение отношения hasMany между One и OneTwo, чтобы вы могли легко применять ограничения, но это не означает, что вам придется отказаться от существующегоотношения (вы просто используете это отношение для определения объема вашего запроса), например

Одна модель

public function oneTwo()
{
    return $this-hasMany(OneTwo::class);
}

Таким образом, вы можете структурировать свой запрос следующим образом:

$ones = One::with('twos')->whereHas('oneTwos.three', function ($q) {
    $q->where('value', 'yes');
})->get();

В приведенном выше примере я предполагаю, что ваши отношения называются three, поскольку это отношения hasOne.Если это threes, вам просто нужно изменить отношение whereHas на 'oneTwos.threes'.

0 голосов
/ 26 апреля 2019

Можете ли вы попробовать это

 $ones = One::with('twos')->whereHas('one_two.threes', function ($q) {
    $q->where('value', 'yes');
 })->get();

Модель ONE отношения с TWO:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function one_two()
{
    return $this->hasMany('App\Models\Two','one_id','id');
}

Модель OneTwo отношения с THREE:

/**
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function three() {

    return $this->belongsTo('App\Models\Three','one_two_id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...