2015-07-22 69 views
1

我努力做到以下幾點: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 

我使用的口才,使用了以下內容:

$sections = Content::orderBy('sequence', 'desc') 
       ->groupBy('parent_id')->get(); 

如果我輸出這些foreach循環中,那麼它只會顯示的記錄之一,那裏有多個具有相同PARENT_ID,如果我刪除groupBy那麼它會顯示所有的記錄,但沒有團體

我已經建立了,這樣的關係:有一個belongsTo關係..所以

public function sections() 
    { 
    return $this->belongsTo('App\Sections', 'section_id'); 
    } 

我要去哪裏錯了嗎?

UPDATE:

 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 

回答

2

如果我理解正確的話,你想獲取內容的列表與他們的孩子的內容對象的對象連接起來,正確嗎?

最簡單的方法是在你的口才內容模型建立親子關係,然後使用該兒童加載家長:

<?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-> children屬性,該屬性包含所有兒童的集合內容對象。所有兒童對象還將在$ childContent->父母中持有對其父母的引用。父母和子女都將在- >屬性中具有相應的部分。

如果你想現在你刀片模板顯示一些內容層次結構,你可以通過變量視圖中的$內容,並做到以下幾點:

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

謝謝。這是可悲的返回沒有..但我認爲這是因爲'內容'的外鍵尚未建立。所以'parent_id'必須是表內其他記錄的外鍵? – Phorce

+0

是的。對於孩子,你必須將其設置爲父內容ID的ID。對於父內容對象,它應該設置爲null。 –

+0

不行,它不工作..外鍵設置爲:'parent_id' - >爲內容表中的其他部分和'section_id'部分表內ID的外鍵? – Phorce