我有两个模型One
和Two
,它们通过数据透视表“ one_two”关联,后者具有自己的模型OneTwo
和hasOne Three。
现在,我想按值将所有One实例过滤为3。
这是我尝试过但没有成功的事情:
$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
一个<=>两个:多对多
三=>一二:一对一
答案 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
模型上使用关系。
解决此问题的一种方法是在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'
。