2017-09-01 43 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() }}