如何在laravel中为急切负载关系添加条件?

时间:2018-03-29 15:29:16

标签: php laravel

有以下型号:

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);

谢谢!

2 个答案:

答案 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);