Yii2查找父类别中的所有产品

Yii2查找父类别中的所有产品,yii2,yii2-advanced-app,yii2-basic-app,Yii2,Yii2 Advanced App,Yii2 Basic App,我有两个表结构如下: category(id,cat_name , parent_id); product(id,category_id ,pro_name); 产品模型中的关系 public function getCategory() { return $this->hasOne(Category::className(), ['id' => 'category_id']); } Category id cat_name par

我有两个表结构如下:

category(id,cat_name , parent_id);
product(id,category_id ,pro_name);
产品模型中的关系

public function getCategory()
    {
        return $this->hasOne(Category::className(), ['id' => 'category_id']);
    }  

Category

id   cat_name    parent_id
1    Electronic   0
2    Fruit        0
3    TV           1
4    Apple        2

Product
id category_id  pro_name
1  1            Samsung
2  3            Sony
3  3            Panasonic
4  2            Apple
5  2            Orange
我想做的是当我选择第(1)类电子产品时 我想去 三星,索尼,松下从表产品

// given $id is your current toplevel category
$cat_ids = Category::find()->select('id')->where(['parent_id' => $id])->asArray()->all();
$ids = [];
foreach($cat_ids as $value)
{
    $ids[] = $value['id'];
}
$ids = implode(',',$ids);
$categories = Products::find()->where('category_id IN ('.$ids.','.$id.')')->all();
这里有一些对象到数组的功能性,您可以进行清理。这是快速和肮脏的,但应该工作。你明白了


这里有一些对象到数组的功能性,您可以进行清理。这是快速和肮脏的,但应该工作。你明白了。

因此,你必须在你的
类别
模型中有一个关系函数来调用更多类别。以及另一个调用产品的关系函数。我假设名称是
getParentId()
getProducts()
。(如果没有,可以使用为您生成)

以下是一种递归方法,您可以在
类别
模型中执行:

public function getSubCategories()
{
    if ($categories = $this->parentId) { // the name of your relational function.   
        foreach ($this->parentId as $sub) {
            $categories = array_merge($categories, $sub->subCategories);
        }
    }

    return $categories;
}

public function getProductsWithSubcategories()
{
    $products = $this->products; // the name of your relational function.   

    foreach ($this->subCategories as $sub) {
        $products = array_merge($products, $sub->products);
    }

    return $products;
}

因此,在
类别
模型中必须有一个调用更多类别的关系函数。以及另一个调用产品的关系函数。我假设名称是
getParentId()
getProducts()
。(如果没有,可以使用为您生成)

以下是一种递归方法,您可以在
类别
模型中执行:

public function getSubCategories()
{
    if ($categories = $this->parentId) { // the name of your relational function.   
        foreach ($this->parentId as $sub) {
            $categories = array_merge($categories, $sub->subCategories);
        }
    }

    return $categories;
}

public function getProductsWithSubcategories()
{
    $products = $this->products; // the name of your relational function.   

    foreach ($this->subCategories as $sub) {
        $products = array_merge($products, $sub->products);
    }

    return $products;
}

添加您在模型中创建的sql和关系。您想做什么?您有一个子类别,是否要显示父类别中的所有产品?@Jorgen yes我要做的是选择父类别中的所有产品及其子类别。请帮助添加您的sql。您也尝试过从产品p中选择*在p.category_id=cp.id上加入类别cp在cp.parent_id=cc.id中加入类别cc,其中cc.id=1,但我不知道如何在active record@Inaseskulla中写入您尊敬的sql和在模型中创建的关系。您想做什么?您有一个子类别,是否要显示父类别中的所有产品?@Jorgen yes我要做的是选择父类别中的所有产品及其子类别。请帮助添加您的sql。您也尝试过从产品p选择*在p.category_id=cp.id上加入类别cp在cp.parent_id=cc.id上加入类别cc,其中cc.id=1,但我不知道如何在active record@Inaseskullwow中编写它。哇,工作正常。非常感谢你。你救了我的命是的,但有两个问题——太不完美了。您可以在上阅读,也可以将其合并为一个。此解决方案仅适用于以下一个级别的类别。但如果情况不止如此呢<代码>主类别>子类别>子类别>等Wow哇哦,工作正常。非常感谢你。你救了我的命是的,但有两个问题——太不完美了。您可以在上阅读,也可以将其合并为一个。此解决方案仅适用于以下一个级别的类别。但如果情况不止如此呢<代码>主类别>子类别>子类别>等