有以下型号:
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);
}
请告诉我,怎么做?
我通过从模型中删除$并使用以下代码选择数据来解决此问题:
Page::with(['blocks.fields.data'=> function($query) use ($page_id){
$query->where('page_id', $page_id);
}])->find($page_id);
但它并不美丽。我只想写Page :: find($ page_id);
谢谢!
答案 0 :(得分:0)
我喜欢强制加载关系,但在你的情况下,也许这就是你要找的东西:
https://laravel.com/docs/master/eloquent-resources#conditional-relationships
答案 1 :(得分:0)
您可以执行以下操作:
Page::whereHas('blocks.fields.data', function($query) use ($page_id){
$query->where('page_id', $page_id);
})->find($page_id);