[英]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.