如何访问表,其中与数据透视表有关?

时间:2019-04-26 06:07:05

标签: laravel laravel-5 eloquent

我有两个模型OneTwo,它们通过数据透视表“ one_two”关联,后者具有自己的模型OneTwo和hasOne Three。 现在,我想按值将所有One实例过滤为3。 这是我尝试过但没有成功的事情:

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

该怎么做?

onesidfield1

twosidfield2

one_twoidone_idtwo_idpivot_field

threesidone_two_idvalue

一个<=>两个:多对多

三=>一二:一对一

2 个答案:

答案 0 :(得分:0)

你能试试吗

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

具有两个模型ONE的关系:

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

模型OneTwo与三个关系:

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

    return $this->belongsTo('App\Models\Three','one_two_id');
}

答案 1 :(得分:0)

对于这种事情,由于laravel构建其多对多查询的方式,我认为您不能直接在Pivot模型上使用关系。

解决此问题的一种方法是在hasManyOne之间定义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'