2017-09-01 33 views
1

的所有的父母我有類別和子類別中laravelLaravel得到

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Category extends Model 
{ 
    protected $table = 'categories'; 

    public function parent() 
    { 
     return $this->belongsTo('App\Category', 'parent_id'); 
    } 

    public function children() 
    { 
     return $this->hasMany('App\Category', 'parent_id'); 
    } 
} 

而且我可以添加屬於一個已經創建類別新的類別。例如「測試 - >測試的子類別」,然後假設我將創建屬於測試子類別的「測試的子子類別」,如下所示:「測試 - >測試子類別 - >子測試子類別「 而在視圖中,我想打印該類別的父母(如果有)。 我不喜歡這樣寫道:

@if($category->parent) 
    <td>{{ $category->parent->name }} <strong>-></strong> {{ $category->name }}</td> 
@else 
    <td>{{ $category->name }}</td>  
@endif 

但是這隻能說明一個父類(「測試的子類 - >測試的子subcategori」)。我想向所有父母展示如下所示:「測試 - >測試子類別 - >子測試子類別」 我該怎麼做?

+0

對於這樣的事情,我會建議看看嵌套集。你可能會發現這個包有用:https://github.com/lazychaser/laravel-nestedset –

回答

3

你可以在Cateory模式,檢索所有的父母,並將它們放入一個集合定義模型訪問。因此,在您Category模型添加下面的方法:

public function getParentsAttribute() 
{ 
    $parents = collect([]); 

    $parent = $this->parent 

    while(!is_null($parent)) { 
     $parents->push($parent); 
     $parent = $parent->parent; 
    } 

    return $parents; 
} 

然後在刀片的模板,你可以賣到一個類別

@if(count($category->parents)) 
    <td>{{ $category->parents->implode('-') }} <strong>-></strong> {{ $category->name }}</td> 
@else 
    <td>{{ $category->name }}</td> 
@endif 

我看到不同的沒有其他的解決方案,從遞歸地檢索所有的父母所有的家長以及@Ross Wilson在評論中提出的軟件包。考慮到查詢的數量將等於父類別的數量。

您可以做的另一件事是將父樹設置到categories表中的數據庫中,以節省大量查詢。在categories表中添加一個類似parents_tree的字符串字段,並在保存/更新時設置此值,並且父名稱已連接在一起。這有點髒,因爲如果其中一個父母更改了名字,您必須相應地更新所有的孩子。取決於你想要屈服於哪種折衷。

+0

謝謝我試過了,但在視圖中拋出錯誤「關係方法必須返回一個類型爲Illuminate \ Database \ Eloquent \ Relations的對象\關係「任何想法爲什麼是這樣的? – TheAngelM97

+0

你想用'()'括號來做'$ category-> parents()'嗎? – Desh901

+0

我試圖沒有括號 現在我添加了它們,它工作正常,謝謝! – TheAngelM97

1

可以追加父變量:

class Category extends Model 
{ 
    protected $table = 'categories'; 

    protected $appends = [ 
     'parent' 
    ]; 

    public function parent() 
    { 
     return $this->belongsTo('App\Category', 'parent_id'); 
    } 
} 

這是最短的解決方案,但是這是不是最好的辦法,因爲每一次,然後父對象被加載。最好這樣做:

class Category extends Model { protected $ table ='categories';

public function parent() 
{ 
    return $this->belongsTo('App\Category', 'parent_id'); 
} 

public function getParentsNames() { 
    if($this->parent) { 
     return $this->parent->getParentsNames(). " > " . $this->name; 
    } else { 
     return $this->name; 
    } 
} 

在刀片打電話:{{ $category->getParentsNames() }}