Laravel 4:与跨模型选项的雄辩关系

时间:2015-01-28 15:09:45

标签: templates laravel eloquent

我试图建立一个简单的模板系统。

我有以下模型:PageTemplateTemplatevariable

因此Page有一个TemplateTemplateTemplatevariables。但是,对于不同的Templates,只有少数不同的Templatevariables,但很多Pages

templatevariables表同时包含template_idpage_id,因此我知道它们属于哪个Page

我的问题是,我不知道如何用Eloquent做到这一点。在Template模型中,如果我这样做:

public function variables() {
    return $this->hasMany('Templatevariable');
}

它将返回所有 Templatevariables Template的{​​{1}},而不是Page。我显然不想要那个。我希望能够做这样的事情(在我的控制器中):

public function show($id) {
    $page = Page::find($id)
    $template = $page->template;
    foreach($template->variables as $variable)
        $data[$variable->name] = $variable->value;

    $data['page'] = $page;

    return View::make($template->view, $data);
}

我想这很可能在模型中实现自动化,但我无法弄清楚如何。

谢谢!

很抱歉,如果我这样做不正确,请先在此处发帖。

1 个答案:

答案 0 :(得分:0)

您只需使用page_id检索具有所需where()的变量即可。在关系中:

public function variables(){
    return $this->hasMany('Templatevariable')->where('page_id', $this->page->id);
}

(如果模板表包含page_id,您也可以直接使用->where('page_id', $this->page_id)

或查询时:

$template = $page->template;
$variables = $template->variables()->where('page_id', $id)->get();
foreach($variables as $variable)
    $data[$variable->name] = $variable->value;
// ...