Laravel 5 - Elequent GROUP BY失败

时间:2015-07-22 07:01:33

标签: php mysql laravel-5 eloquent database-relations

我正在尝试执行以下操作:

我有两张桌子:

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 个答案:

答案 0 :(得分:2)

如果我理解正确,您想要获取内容对象及其子内容对象的列表,对吗?

最简单的方法是在您的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();

$ contents将包含所有没有父对象的Content对象的集合。每个对象都有一个 $ content-&gt; children 属性,该属性包含所有子内容对象的集合。所有子对象也将在 $ childContent-&gt; parent 中保留对其父对象的引用。父母和孩子都将在 - &gt;部分属性中包含相应的部分。

如果您想在 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();