Я пытаюсь сделать следующее:
У меня есть две таблицы:
1) Content
id,
section_id
parent_id,
sequence,
2) Sections
id,
title,
description,
date_entered
Каждый Контент должен иметь раздел, который определяется внешним ключом, контент может иметь подраздел, где, если контент имеет одинаковый parent_id — тогда это классифицируется как подраздел. Так, например:
1. My first section
1.1. My first sub section
2. My second section
3. My third section
3.1 My third sub section
Я использую Eloquent и использовал следующее:
$sections = Content::orderBy('sequence', 'desc')
->groupBy('parent_id')->get();
Если я выведу их в цикле foreach, то он покажет только одну из записей, где есть несколько с одинаковым parent_id, если я удалю groupBy
тогда он будет отображать все записи, но не в группах
Я установил отношения так, что: есть belongsTo
отношения .. итак
public function sections()
{
return $this->belongsTo('App\Sections', 'section_id');
}
Куда я здесь не так?
ОБНОВИТЬ:
1) Content
id,
section_id
parent_id,
sequence,
FOREIGN KEYS:
parent_id -> id,
section_id -> id on Sections (below)
2) Sections
id,
title,
description,
date_entered
Если я правильно понимаю, вы хотите получить список объектов Content вместе с их дочерними объектами Content, верно?
Самый простой способ сделать это — создать отношения между родителями и детьми в вашем Eloquent содержание модель, а затем использовать это, чтобы загрузить родителей с детьми:
<?php
class Content extends Model {
public function children() {
//this defines a relation one-to-many using parent_id field as the foreign key
return $this->hasMany(Content::class, 'parent_id');
}
public function parent() {
return $this->belongsTo(Content::class, 'parent_id');
}
public function section() {
return $this->belongsTo(Section::class);
}
}
Затем, если вы хотите перечислить содержание возражает их Раздел вместе со своими детьми и их разделами вы можете получить такие данные:
$contents = Content::with(['children', 'section', 'children.section'])->whereNull('parent_id')->get();
$ content будет содержать коллекцию всех объектов Content, у которых нет родителя. Каждый из объектов будет иметь $> Дети Content- атрибут, который содержит коллекцию всех детей содержание объекты. Все дочерние объекты также будут содержать ссылку на своего родителя в $ ChildContent-> Родитель. И родители, и дети будут иметь свой соответствующий раздел в -> раздел приписывать.
Если вы хотите отобразить некоторую иерархию контента сейчас в вашем лопасть шаблон, вы можете передать переменную $ contents в представление и сделать следующее:
<ul>
@foreach($contents as $content)
<li>{{$content->title}}</li>
@if($content->children->count() > 0)
<ul>
@foreach($content->children as $childContent)
<li>{{$childContent->title}}</li>
@endforeach
</ul>
@endif
@endforeach
</ul>
Я заметил, что у вас есть последовательность поле в вашей модели. Я предполагаю, что вы хотите, чтобы содержимое было отсортировано по этому полю. В этом случае вам нужно изменить способ получения данных:
$contents = Content::with(['children' => function($builder) {
$builder->orderBy('sequence', 'desc');
}, 'section', 'children.section'])->whereNull('parent_id')->get();
Других решений пока нет …