[英]How in laravel to add a condition for a eager load relation?
有以下模型:
class Page extends Model {
protected $with = ['blocks'];
public function blocks() {
return $this->belongsToMany('\App\Block');
}
}
class Block extends Model {
protected $with = ['fields'];
public function fields() {
return $this->hasMany('\App\Fields');
}
}
class Field extends Model {
protected $with = ['data'];
public function data() {
return $this->hasOne('\App\Data');
}
}
还有一个控制器,我可以在其中获取数据:
public function get() {
$page_id = 1;
$data = Page::find($page_id);
}
结果为以下结构:
Page
- Block 1
- field 1
- Some data
- field 2
- More data
- Block 2
- Field 1
- Other data
该块可能属于多个页面。
该字段属于该块。
但是存储在该字段中的数据同时属于该字段和页面。
因此,我需要将变量$ page_id传递给Field模型的data()函数。 要获得这样的东西:
public function data() {
return $this->hasOne('\App\Data')->where('page_id', '=', $page_id);
}
请告诉我,该怎么做?
我通过从模型中删除$ with并使用以下代码选择数据来解决了这个问题:
Page::with(['blocks.fields.data'=> function($query) use ($page_id){
$query->where('page_id', $page_id);
}])->find($page_id);
但这并不漂亮。 我只想写Page :: find($ page_id);
谢谢!
我喜欢强制加载关系,但是在您的情况下,这可能是您想要的:
https://laravel.com/docs/master/eloquent-resources#conditional-relationships
您可以按照以下步骤进行操作:
Page::whereHas('blocks.fields.data', function($query) use ($page_id){
$query->where('page_id', $page_id);
})->find($page_id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.