我试图了解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”。
答案 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']);