2015-12-11 5 views
-1

Я пытаюсь разобраться в отношениях Ларавеля, но с трудом справляюсь с последней частью того, чего я пытаюсь достичь.Laravel Eloquent Relationship hasMany hasOne

Мои таблицы следующим образом:

pagetemplates

id 

страницы

id 
pagetemplate_id 

pagetemplate_blocks

id 
pagetemplate_id 

pagetemplateblocks_content

id 
page_id 
page_template_block_id 

Так при загрузке страницы из БД Мне нужно, чтобы получить его с 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'); 

"блоки" возвращает следующее:

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

«blockcontent» возвращает следующее:

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

Таким образом, это означает, что он никогда не ударять «pagetemplateblockcontent», который предложил создать Joost.

+0

Каков ваш запрос/способ получения данных? – Joost

+0

Я использую '$ this-> pageRepo-> где ('id', $ id) -> с ('pageTemplate');' – Karl

+0

что такое '$ this-> pageRepo', пожалуйста, добавьте полный метод к вашему вопрос – Joost

ответ

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']); 
+0

Единственное, с чем я смущаюсь, это то, что в pagetemplateblock может быть много параметров pagetemplateblockcontent , хотя это связано с конкретной страницей, а также с pagetemplateblock. Учитывает ли ваш пример это? – Karl

+0

Если вы связываете свою страницу с pagetemplateblockcontent, вы получите только отношения, связанные со страницей. да, если вы имеете в виду это. Храните свой простой код на странице, не нужно напрямую ссылаться на pagetemplateblock или его содержимое, если ваши отношения настроены правильно, вы можете получить те, которые связаны только с текущей страницей. – Joost

+0

Я только что пробовал ваш метод, но получаю следующее сообщение об ошибке: 'Метод связи должен возвращать объект типа Illuminate \ Database \ Eloquent \ Relations \ Relation' – Karl

Смежные вопросы