在我的数据库中,我有一个Categories表。类别可以具有父类别,使其成为递归关系
我也有产品表。每种产品属于一个类别。
比如说,我有一棵看起来像这样的树:
Category
Sub-Category 1
Sub-Sub-Category 1
Product 1
Product 2
Product 3
Product 4
Sub-Sub-Category 2
Product 5
Product 6
Product 7
Product 8
Sub-Category 2
Sub-Sub-Category 3
Product 9
Product 10
Product 11
Product 12
如果我$SubCategory1->products
,我希望它能给我产品1-8
如果我$SubSubCategory3->products
,我希望它能给我产品9-12
如果我$Category->products
,我希望它能给我所有产品
基本上,我希望该类别能够提供属于它的所有产品
答案 0 :(得分:5)
假设您的模型名称是Category
在类别模型上创建一个函数
public function children() { return $this->hasMany('App\Category', 'parent_id', 'id'); }
在控制器上使用上述方法
$categories = Category::with('children')->where('parent_id',0)->get();
答案 1 :(得分:3)
在希望找到一个很好地使用Laravel的答案之后,我最终放弃了,只是编写代码来做我想做的事情,结果比我预期的要小。
public function all_products()
{
$products = [];
$categories = [$this];
while(count($categories) > 0){
$nextCategories = [];
foreach ($categories as $category) {
$products = array_merge($products, $category->products->all());
$nextCategories = array_merge($nextCategories, $category->children->all());
}
$categories = $nextCategories;
}
return new Collection($products); //Illuminate\Database\Eloquent\Collection
}
答案 2 :(得分:2)
请尝试以下Has Many Through关系并发布结果
class Category extends Model
{
public function products()
{
return $this->hasManyThrough(
'App\Product', 'App\Category',
'parent_id', 'catergory_id', 'id'
);
}
}
然后您可以使用$category->products;
查找您的商品
答案 3 :(得分:2)
这种方式效果很好:
class One extends Model {
public function children()
{
return $this->hasMany(self::class, 'parent_id');
}
public function grandchildren()
{
return $this->children()->with('grandchildren');
}
}
答案 4 :(得分:0)
您最好使用嵌套集模型。您应该使用此数据结构,因为它可以通过一种简单的方法在mysql中获得最快的查询方法。仅具有parent_id属性,您不知道树的深度,这在知道需要多少个联接时会产生问题。 我为您提供这篇出色的文章。 managing-hierarchical-data-in-mysql
对于那些使用laravel框架的人,我更喜欢建议这个惊人的软件包:Baum
答案 5 :(得分:0)
对于在此处搜索此答案的任何人来说,这是一个简单的解决方案:
class Group extends Model
{
public function ancestry()
{
return $this->belongsTo('App\Group', 'parent_id')->with('ancestry');
}
public function descent()
{
return $this->hasMany('App\Group', 'parent_id')->with('descent');
}
}
ancestry 函数会给你根的路径,descent 会给你所有的后代节点。
答案 6 :(得分:0)
我在表(用户)中创建了 managed_by 并且这个解决方案获得了所有无限级别的孩子。
在用户模型中
public function Childs(){
return $this->hasMany('App\User', 'managed_by', 'id')->with('Childs');
}
在帮助文件中(我的魔法解决方案)
if (!function_exists('user_all_childs_ids')) {
function user_all_childs_ids(\App\User $user)
{
$all_ids = [];
if ($user->Childs->count() > 0) {
foreach ($user->Childs as $child) {
$all_ids[] = $child->id;
$all_ids=array_merge($all_ids,is_array(user_all_childs_ids($child))?user_all_childs_ids($child):[] );
}
}
return $all_ids;
}
}
答案 7 :(得分:-1)
说$ category_id = Category-> id,并且您希望将某个产品集合作为该类别的子项,我会尝试:
$ products = App \ Product :: with(['SubSubCategory.SubCategory.Category'=> function($ query)use($ category_id){$ query-> where('id',$ category_id);}] )-> get();
能够这样做。您将需要这样的“一对多”逆关系:
// App \ SubCategory
公共函数Category(){返回$ this-> belongsTo('App \ Category');}
// App \ SubSubCategory
公共函数Sub_Category(){返回$ this-> belongsTo('App \ SubCategory');}
// App \产品
公共函数SubSubCategory(){返回$ this-> belongsTo('App \ SubSubCategory');}
祝你好运。