繁体   English   中英

在laravel中如何为渴望的负载关系添加条件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM