2016-02-18 3 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) Электронный Я хочу получить Samsung, Sony, Panasonic из таблицы Product

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

Некоторые объекты для массивной функции там, которые вы могли бы очистить. Это было быстро и грязно, но должно работать. Вы понимаете.

+0

Wow Wow он отлично работает. Большое спасибо. вы спасли мою жизнь –

+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; 
} 
Смежные вопросы