2016-02-18 81 views
0

我有2個表結構如下:Yii2查找父類的所有產品

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)電子 我想從表中得到的產品三星 ,索尼,松下

+0

添加您的尊重SQL和模型建立的關係。 –

+0

你想做什麼?您有一個子類別,並且您想要在父類別中顯示所有產品? –

+0

@Jorgen是我想要做的是選擇在父類及其子類別中的所有產品,以及。請幫助 –

回答

-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(); 

有些對象可能會清理數組functionallity。這是快速和骯髒的,但應該工作。你明白了。

+0

哇哇它工作正常。非常感謝。你救了我的命 –

+0

是的,但它的兩個疑問 - 所以不完美。您可以在http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data閱讀起來,你也許可以將它做成一個。 –

+0

反正非常感謝 –

3

所以,你必須在你的Category模型調用多個類別關係的功能。另一個關係函數調用產品。我假設的名稱是getParentId()getProducts()。 (如果你沒有,你可以使用Gii來生成它們)

這裏是一個遞歸方法您可以Category模型內部做:

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; 
}