有很多,有很多通过

时间:2015-11-10 12:49:57

标签: laravel laravel-5 laravel-5.1

分类

id | title | parent_id

产品

id | title | category_id

类别表自联接以创建子类别:

id | title | parent_id
 1   art     0
 2   sport   0
 3   brushes 1
 4   paints  1
 5   balls   2

产品属于一个类别,因此足球产品将属于球类别,这是运动的子类别。

我有产品和类别模型。

在类别模型上,我有一个hasManyThrough:

public function products()
{
   return $this->hasManyThrough('Product', 'Category', 'parent_id', 'category_id');
}

我通过以下方式致电:

Category::with('products')->find($catId);

一切正常,我可以获得一个类别中的所有产品,当我需要获得子类别中的所有产品时,问题就出现了,所以使用数据:

id | title | category_id
1    blue paint 4
2   red paint 4
3   fine brush 3

并致电:

Category::with('products')->find(1); //get all art products

我得到蓝色油漆,红色油漆和细刷。

当我调用子类别时会出现问题:

Category::with('products')->find(4); //get all paints

我什么都没得到,我应该得到蓝色和红色的油漆。

我如何打电话给我解决这个问题,以便我可以获得父类或子类的所有产品?

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是使用两种不同的关系:一种需要已经定义的hasManyThrough(),另一种是简单的hasMany():

public function subproducts()
{
    return $this->hasMany('Product');
}

这就留下了必须添加一些" if($ category-> parent_id)"控制器中的块,以便正确调用products()和subproducts()...

或者你可以试着对你现有的产品()关系感到奇怪,并冒险在这个过程中打破一些更基本的Eloquent功能。事实上,它可能根本不起作用。也许是这样的:

public function products()
{
    if ( $this->parent_id )
    {
        return $this->hasMany('Product');
    }
    else
    {
        return $this->hasManyThrough('Product', 'Category', 'parent_id', 'category_id');
    }
}