簡體   English   中英

Laravel 獲取類別的所有父級

[英]Laravel get all parents of category

我在 laravel 中有類別和子類別

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

但這僅顯示一個父類別(“測試的子類別-> 測試的子子類別”)。 我想向所有父母展示,它們看起來像這樣:“測試-> 測試的子類別-> 測試的子子類別”我該怎么做?

您可以在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並在保存/更新時將此值設置為已連接的父名稱。 這有點臟,因為如果其中一個父母更改了它的名字,您必須相應地更新所有孩子。 由您決定要屈服於哪種權衡。

您可以附加父變量:

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() }}

我知道這是舊的,但這里是未來任何人的正確答案。 這將為您提供無限的類別

在類別模型

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

public function getParentsNames() {

    $parents = collect([]);

    if($this->parent) { 
        $parent = $this->parent;
        while(!is_null($parent)) {
            $parents->push($parent);
            $parent = $parent->parent;
        }
        return $parents;
    } else {
        return $this->name;
    }

}

在 Blade 中(我相信您也可以在模型級別執行此操作,但這是我的快速方法)

 @if ($category->getParentsNames() !== $category->name)
                                @foreach ($category->getParentsNames()->reverse() as $item)
                                    @if ($item->parent_id == 0)
                                        <li class="breadcrumb-item"><a href="/{{ $item->slug }}">{{ $item->name }}</a></li>
                                             @else
                                        <li class="breadcrumb-item"><a href="../{{ $item->slug }}">{{ $item->name }}</a></li>
                                    @endif
                                @endforeach  
                            @endif

Result Home / 客廳 / 沙發 / 沙發

我只注意到進入主要類別,也許它對某人有用。

 static function  getDepth($parent_id) {

       $categories= Categories::find($parent_id);

       if ($categories) {
           if ($categories->parent_id == 0) {
               return $categories->category_name;
           } else {
               return self::getDepth($categories->parent_id);
           }
       }

    }

刀片.php

   <td>{{ \App\Models\Admin\Category::getDepth($category->parent_id)}}</td>

到目前為止,我發現的最佳解決方案是使用Nested set model
詳細的解釋/實現已經很長時間了,並且已經有很多關於它的主題。 所以我將縮短主題。

這個想法是用父值之間的值對類別進行分組,依此類推。 例如:

Clothes : 1-10
    - T-shirts: 2-3
    - Pants: 4-9
        - Shorts 5-6
        - Joggers 7-8

使用這些值,只需使用一個查詢就可以很容易地查詢所有的祖先或后代類別,因為它們總是包含在兩個值之間。

一個主要缺點是; 當類別發生變化(創建/刪除/移動)時,需要重新評估和更新節點。


這是(IMO)我找到的最好的解釋: http : //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

我還發現這個庫似乎可以很好地退出https://github.com/lazychaser/laravel-nestedset

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM