Laravel 5 — Ошибка Elequent GROUP BY

Я пытаюсь сделать следующее:

У меня есть две таблицы:

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

1

Решение

Если я правильно понимаю, вы хотите получить список объектов 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();
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]