我正在尝试做以下事情:
我有两个表:
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('AppSections', '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
如果我理解正确,您想获取内容对象及其子内容对象的列表,对吗?
最简单的方法是在Eloquent Content模型中创建一个父子关系,然后用它来加载父节点和子节点:<?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);
}
}
然后,如果你想列出Content对象,它们的Section以及它们的子节点和它们的Section,你可以这样获取数据:
$contents = Content::with(['children', 'section', 'children.section'])->whereNull('parent_id')->get();
$contents将包含所有没有父对象的Content对象的集合。每个对象都有一个$content->children属性,该属性保存所有子对象 content 对象的集合。所有子对象也将在$childContent->parent中保存对其父对象的引用。父级和子级都将在->section属性中拥有相应的section。
如果你想在Blade模板中显示一些内容层次结构,你可以将$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();