Laravel Eloquent Relationship hasMany has One

时间:2015-12-11 10:19:37

标签: php laravel eloquent relationship laravel-5.1

我试图了解Laravel的关系,但我正在努力实现的最后一部分遇到困难。

我的桌子是这样的:

pagetemplates

id

网页

id
pagetemplate_id

pagetemplate_blocks

id
pagetemplate_id

pagetemplateblocks_content

id
page_id
page_template_block_id

因此,在从DB加载页面时,我需要使用pagetemplates,它的块和内容来获取它。

到目前为止,这是我的代码:

page.php文件

public function pageTemplate()
{
    return $this->belongsTo('PageTemplate', 'pagetemplate_id')->with('blocks');
}

public function pagetemplateblockcontent()
{
    return $this->belongsToMany('PageTemplateBlockContent', 'pagetemplateblocks_content', 'page_id', 'page_template_block_id')->withTimestamps();
}

public function pagecontent()
{
    return $this->hasMany('PageTemplateBlockContent', 'page_id')->with('pagetemplateblock');
}

PageTemplate.php

public function page()
{
    return $this->hasMany('Page', 'pagetemplate_id');
}    

public function blocks() {
    return $this->hasMany('PageTemplateBlock', 'pagetemplate_id')->orderBy('sort_order', 'asc')->with('blockcontent');
}

PageTemplateBlock.php

public function pagetemplate() {
    return $this->belongsTo('PageTemplate', 'pagetemplate_id');
}

public function blockcontent() {
    return return $this->hasOne('PageTemplateBlockContent');
}

PageTemplateBlockContent.php

public function pagetemplateblock()
{
    return $this->belongsTo('PageTemplateBlock', 'page_template_block_id');
}

然而,问题在于content,如果我尝试这个,它会返回一个PageTemplateBlockContent实例,这对所有页面都是一样的。虽然每个页面应该有不同的PageTemplateBlockContent。我不知道如何解决这个问题,所以任何想法都会受到高度赞赏。

已更新

我的控制器调用

$this->pageRepo->where('id', $id)->with('pageTemplate');

“pageTemplate”返回以下内容:

return $this->belongsTo('PageTemplate', 'pagetemplate_id')->with('blocks');

“blocks”返回以下内容:

return $this->hasMany('PageTemplateBlock', 'pagetemplate_id')->orderBy('sort_order', 'asc')->with('blockcontent');

“blockcontent”返回以下内容:

return $this->hasOne('PageTemplateBlockContent');

所以这意味着它永远不会达到Joost建议创建的“pagetemplateblockcontent”。

1 个答案:

答案 0 :(得分:0)

更改

public function pagetemplateblockcontent()
{
    return $this->belongsToMany('PageTemplateBlockContent', 'pagetemplateblocks_content', 'page_id', 'page_template_block_id')->withTimestamps();
}

public function pagetemplateblockcontent()
{
    return $this->belongsToMany('PageTemplateBlockContent', 'pagetemplateblockscontent_page', 'page_id', 'page_template_block_id')->withTimestamps();
}

并使用两个主键创建一个表page_pagetemplateblockcontent。

$table->integer("page_id")->unsigned();
$table->integer("page_template_block_id")->unsigned();

$table->primary(['page_id', 'page_template_block_id']);