Работа с категориями товаров.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Работа с категориями товаров.

Сообщение Artikk »

Здравствуйте.
Есть таблица product:
https://c2n.me/3S4Fc0V в ней есть поле category_id, куда записывается id ПОДКАТЕГОРИИ.
Есть таблица категории https://c2n.me/3S4Fecb
Вопрос. Как мне вывести по ID КАТЕГОРИИ все товары, которые относятся ко всем подкатегориям этой категории? надеюсь поняли))
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Работа с категориями товаров.

Сообщение slo_nik »

Доброй ночи.
Создайте в моделях связи и через них выводите данные.
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Работа с категориями товаров.

Сообщение Artikk »

Доброй)) Да я пробовал, не получается.... Можете подсказать как именно?
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Работа с категориями товаров.

Сообщение slo_nik »

Artikk писал(а): 2018.02.21, 02:33 Доброй)) Да я пробовал, не получается.... Можете подсказать как именно?
Как пробовали. Покажите.
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Работа с категориями товаров.

Сообщение Artikk »

вот, в модели product:

Код: Выделить всё

public function  getCategory(){
        return $this->hasOne(Category::ClassName(), ['id' => 'category_id']);
    }
но так я получаю не то совсем....
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Работа с категориями товаров.

Сообщение BalykhinAS »

Artikk писал(а): 2018.02.21, 01:08 Здравствуйте.
Есть таблица product:
https://c2n.me/3S4Fc0V в ней есть поле category_id, куда записывается id ПОДКАТЕГОРИИ.
Есть таблица категории https://c2n.me/3S4Fecb
Вопрос. Как мне вывести по ID КАТЕГОРИИ все товары, которые относятся ко всем подкатегориям этой категории? надеюсь поняли))
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Работа с категориями товаров.

Сообщение BalykhinAS »

Wizard писал(а): 2018.02.21, 13:20
Artikk писал(а): 2018.02.21, 01:08 Здравствуйте.
Есть таблица product:
https://c2n.me/3S4Fc0V в ней есть поле category_id, куда записывается id ПОДКАТЕГОРИИ.
Есть таблица категории https://c2n.me/3S4Fecb
Вопрос. Как мне вывести по ID КАТЕГОРИИ все товары, которые относятся ко всем подкатегориям этой категории? надеюсь поняли))
для начала надо собрать все дочерние иды конкретной категории.

а сам запрос будет выглядеть так

Код: Выделить всё

$query->andWhere(new Expression('category_id in ('. implode(', ', $currentCategory['children']) .')'));
где $currentCategory['children'] иды всех дочерних категорий

https://packagist.org/packages/paulzi/y ... cency-list

для небольшого количества категорий лично я выбираю все категории одним запросом и формирую из них два массива
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Работа с категориями товаров.

Сообщение andku83 »

Код: Выделить всё

//код в модели поиска/фильтрации
        $query = Product::find()->active();

        if ($category) { // модель категории
            $childrenIds = $category->getChildrenIds();
            $query->andWhere(['category_id' => $childrenIds]);
        }

// метод в модели категории
    public function getChildrenIds($ids = [])
    {
        if (empty($ids))
            $ids[] = $this->id;

        $childs = self::find()->innerJoinWith('childs childs', false)
            ->select('childs.id')
            ->andWhere(['{{%category}}.id' => $ids, 'childs.status' => Category::STATUS_ACTIVE])
            ->column();   //количество этих запросов зависит от глубины дерева

        if (!empty($childs))
            $ids = array_filter(array_merge($ids, $this->getChildrenIds($childs)));

        return $ids;
    }
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Работа с категориями товаров.

Сообщение BalykhinAS »

ElisDN писал(а): 2018.02.07, 10:16

Код: Выделить всё

if (!empty($this->category_id)) {
    $ids = [$this->category_id];
    $childrenIds = $ids;
    while ($childrenIds = Category::find()->select('id')->andWhere(['parent_id' => $childrenIds])->column()) {
        $ids = array_merge($ids, $childrenIds);
    }
    $query->andWhere(['category_id' => array_unique($ids)]);
}
адаптируйте в соответсвии со своим кодом
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Работа с категориями товаров.

Сообщение Artikk »

Немного не понял.
1. Что такое active()?
Вот я получил id категории: $cats = Category::findOne($id);
Вот у меня идет запрос продуктов

Код: Выделить всё

$dataProvider = new ActiveDataProvider([
			'query' => $query = Product::find()->where(['category_id' => $cats->parent_id]),
			'sort'=>array(
				'defaultOrder'=>['id' => SORT_DESC],
			),
			'pagination' => [
				'pageSize' => 9,
			],
		]);
п.с. но запрос не правильный)
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Работа с категориями товаров.

Сообщение BalykhinAS »

Код: Выделить всё

$category = Category::findOne($id);

$query = Product::find();
        
if (!empty($category)) {
    $ids = [$category->id];
    $childrenIds = $ids;
    while ($childrenIds = Category::find()->select('id')->andWhere(['parent_id' => $childrenIds])->column()) {
        $ids = array_merge($ids, $childrenIds);
    }
    $query->andWhere(['category_id' => array_unique($ids)]);
}

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort'=>array(
        'defaultOrder'=>['id' => SORT_DESC],
    ),
    'pagination' => [
        'pageSize' => 9,
    ],
]);
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Работа с категориями товаров.

Сообщение andku83 »

Artikk писал(а): 2018.02.21, 15:52 1. Что такое active()?

Код: Выделить всё

    public function active()
    {
        return $this->andWhere(['!=', '{{%product}}.status', Product::STATUS_OFF]);
    }
в предыдущем сообщении за вас написали рабочий вариант
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Работа с категориями товаров.

Сообщение Artikk »

Код: Выделить всё

$category = Category::findOne($id);

$query = Product::find();
        
if (!empty($category)) {
    $ids = [$category->id];
    $childrenIds = $ids;
    while ($childrenIds = Category::find()->select('id')->andWhere(['parent_id' => $childrenIds])->column()) {
        $ids = array_merge($ids, $childrenIds);
    }
    $query->andWhere(['category_id' => array_unique($ids)]);
}

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort'=>array(
        'defaultOrder'=>['id' => SORT_DESC],
    ),
    'pagination' => [
        'pageSize' => 9,
    ],
]);
спасибо, работает.
Ответить