Как можно получить бренды которые есть у товаров этой категории?

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

Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

Подскажите, пожалуйста, как можно получить определённые бренды, которые есть у товаров этой категории?
На данный момент вывожу просто все бренды вот так:

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

$brands = Brands::find()->all();
PS:
Я понимаю что мне нужен запрос в виде, но как получить ID этих брендов ни пойму!
$brands = Brands::findAll([1, 2, 3, 4]);

Update:
Мой CatController:

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

    public function actionView($id)
    {
        $id = Yii::$app->request->get('id');
        $category = Cat::find()->where(['id' => $id])->one();
        if(!$category){
            throw new NotFoundHttpException('Такой категории не существует');
        }
        $prod = Prod::find()->where(['category_id' => $id])->all();
        
        
        $brnd = Brnd::find()->all(); --> тут вывожу все бренды


        return $this->render('view', [
            'model' => $this->findModel($id),
            'prod' => $prod,
            'category' => $category,
            'brnd' => $brnd,
        ]);
    }
Мой View категорий (где формируеться foreach по брендам):

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

<div class="lists" style="display: flex;">
    <?php foreach ($brnd as $b): ?>
        <div class="item" style="border: 1px solid #aaa; padding:10px">
            <?= Html::a($b->name, ['brnd/view', 'id' => $b->id], ['class' => 'class-name']) ?>
        </div>
    <?php endforeach; ?>
</div>
Модель Cat:

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

<?php

namespace frontend\models;

use Yii;

/**
 * This is the model class for table "cat".
 *
 * @property int $id
 * @property int $parent_id
 * @property string $name
 */
class Cat extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'cat';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['parent_id', 'name'], 'required'],
            [['parent_id'], 'integer'],
            [['name'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'parent_id' => 'Parent ID',
            'name' => 'Name',
        ];
    }
}
Модель product:

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

<?php

namespace frontend\models;

use Yii;

/**
 * This is the model class for table "prod".
 *
 * @property int $id
 * @property int $category_id
 * @property int $brand_id
 * @property string $name
 */
class Prod extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'prod';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['category_id', 'brand_id', 'name'], 'required'],
            [['category_id', 'brand_id'], 'integer'],
            [['name'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'category_id' => 'Category ID',
            'brand_id' => 'Brand ID',
            'name' => 'Name',
        ];
    }

    // Связываем категории (получаем имя категории)
    public function getCat()
    {
        return $this->hasOne(Cat::className(), ['id' => 'category_id']);
    }

    // Связываем бренды (получаем имя бренда)
    public function getBrnd()
    {
        return $this->hasOne(Brnd::className(), ['id' => 'brand_id']);
    }
}
Модель Brands:

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

<?php

namespace frontend\models;

use Yii;

/**
 * This is the model class for table "brnd".
 *
 * @property int $id
 * @property string $name
 */
class Brnd extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'brnd';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['name'], 'required'],
            [['name'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Name',
        ];
    }
}
Последний раз редактировалось never0more7 2020.10.09, 16:00, всего редактировалось 2 раза.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение unknownby »

Составить правильно запрос и будет счастье.
И откуда мы знаем, что у вас там вообще есть? Может вы просто отображаете список брендов во вьюхе и ничего больше. Где контроллер, где вьюха, где модель? Где хоть что-то?
А то "мне надо получить бренды этой категории, как это сделать?" Ответ: так и сделать, взять и получить бренды данной категории

P.S. Какие имеются связи? Где нужно выводить бренды? Что есть на вьюхе, в которой нужно выводить бренды под конкретную категорию или категории.
Arhat109
Сообщения: 61
Зарегистрирован: 2016.11.23, 09:06
Откуда: из СССР

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение Arhat109 »

Добавить в запрос условие ->where( [категории=>этаКатегория] )->all()
Все чаще Историки находят следы древней и очень высокоразвитой Цивилизации, со странными буквами .. СССР
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение unknownby »

Arhat109 писал(а): 2020.10.09, 14:26 Добавить в запрос условие ->where( [категории=>этаКатегория] )->all()
Не всё так просто. Он упомянул товары, бренды и категории. Связать он мог их как угодно :D
Если я правильно понял его мысль, которую он не договорил. У него есть товары, например, штук 20 на странице. Которые он выбрал при помощи категории. Т.е. выбрал 20 товаров с категорией "Мобильный телефон", а теперь из 20 товаров ему нужно выбрать бренды, которые внутри каждого товара, при том сгруппировать по бренду, чтоб не повторялись. По итогу выйдет "huawei, apple, xiaomi, meizu" и скорее всего это всё в фильтр по товарам уходит :)
never0more7
Сообщения: 9
Зарегистрирован: 2020.09.24, 12:57

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

unknownby писал(а): 2020.10.09, 14:47
Arhat109 писал(а): 2020.10.09, 14:26 Добавить в запрос условие ->where( [категории=>этаКатегория] )->all()
Не всё так просто. Он упомянул товары, бренды и категории. Связать он мог их как угодно :D
Если я правильно понял его мысль, которую он не договорил. У него есть товары, например, штук 20 на странице. Которые он выбрал при помощи категории. Т.е. выбрал 20 товаров с категорией "Мобильный телефон", а теперь из 20 товаров ему нужно выбрать бренды, которые внутри каждого товара, при том сгруппировать по бренду, чтоб не повторялись. По итогу выйдет "huawei, apple, xiaomi, meizu" и скорее всего это всё в фильтр по товарам уходит :)
Да, совершенно верно, так нужно! Обновил пост, добавил код моделей и контроллеров! Помогите, пожалуйста!( уже голову поломал как вывести бренды эти(
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение unknownby »

never0more7 писал(а): 2020.10.09, 15:54 Да, совершенно верно, так нужно! Обновил пост, добавил код моделей и контроллеров! Помогите, пожалуйста!( уже голову поломал как вывести бренды эти(
Что насчет этого? Пойдет?

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

    public function actionView($id)
    {
        $id = Yii::$app->request->get('id');
        $category = Cat::find()->where(['id' => $id])->one();
        if(!$category){
            throw new NotFoundHttpException('Такой категории не существует');
        }

        //Все что выше, можно заменить этим
        //А то какие-то получения из ГЕТ, потом поиски и проверка на что-то.
        $model = $this->findModel($id);
        
        //тут видимо поиск всех товаров, который можно исправить
        //убираем all()
        $prod = Prod::find()->where(['category_id' => $id]);
        
        //Теперь у нас есть запрос, который можно использовать по разному.
        //Сгруппируем по бренду и запишем идентификаторы брендов в массив
        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }
        
        //Теперь тут бренды только тех продуктов, которые выпадают под нужную категорию
        $brnd = Brnd::find()->where(['in', 'brand_id', $brands])->all(); 

        return $this->render('view', [
            'model' => $model, //тут возвращаем нужную нам модель
            'prod' => $prod->all(), //тут пропишем вывод всех
            'category' => $category,
            'brnd' => $brnd,
        ]);
    }
    
    //Метод findModel должен быть примерно таким
    protected function findModel($id)
    {
        if (($model = Cat::findOne($id)) !== null) {
            return $model;
        } else {
            throw new HttpException(404, 'The requested page does not exist.');
        }
    }
Итого выйдет такой action

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

    public function actionView($id)
    {
        $model = $this->findModel($id);

        $prod = Prod::find()->where(['category_id' => $id]);

        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }

        return $this->render('view', [
            'model' => $model,
            'prod' => $prod->all(),
            'category' => $category,
            'brnd' => Brnd::find()->where(['in', 'brand_id', $brands])->all(),
        ]);
    }
never0more7
Сообщения: 9
Зарегистрирован: 2020.09.24, 12:57

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

unknownby писал(а): 2020.10.09, 16:36
never0more7 писал(а): 2020.10.09, 15:54 Да, совершенно верно, так нужно! Обновил пост, добавил код моделей и контроллеров! Помогите, пожалуйста!( уже голову поломал как вывести бренды эти(
Что насчет этого? Пойдет?

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

    public function actionView($id)
    {
        $id = Yii::$app->request->get('id');
        $category = Cat::find()->where(['id' => $id])->one();
        if(!$category){
            throw new NotFoundHttpException('Такой категории не существует');
        }

        //Все что выше, можно заменить этим
        //А то какие-то получения из ГЕТ, потом поиски и проверка на что-то.
        $model = $this->findModel($id);
        
        //тут видимо поиск всех товаров, который можно исправить
        //убираем all()
        $prod = Prod::find()->where(['category_id' => $id]);
        
        //Теперь у нас есть запрос, который можно использовать по разному.
        //Сгруппируем по бренду и запишем идентификаторы брендов в массив
        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }
        
        //Теперь тут бренды только тех продуктов, которые выпадают под нужную категорию
        $brnd = Brnd::find()->where(['in', 'brand_id', $brands])->all(); 

        return $this->render('view', [
            'model' => $model, //тут возвращаем нужную нам модель
            'prod' => $prod->all(), //тут пропишем вывод всех
            'category' => $category,
            'brnd' => $brnd,
        ]);
    }
    
    //Метод findModel должен быть примерно таким
    protected function findModel($id)
    {
        if (($model = Cat::findOne($id)) !== null) {
            return $model;
        } else {
            throw new HttpException(404, 'The requested page does not exist.');
        }
    }
Итого выйдет такой action

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

    public function actionView($id)
    {
        $model = $this->findModel($id);

        $prod = Prod::find()->where(['category_id' => $id]);

        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }

        return $this->render('view', [
            'model' => $model,
            'prod' => $prod->all(),
            'category' => $category,
            'brnd' => Brnd::find()->where(['in', 'brand_id', $brands])->all(),
        ]);
    }
Дорогой вы мой спаситель! Спасибо Вам большое!!!!! Вы меня очень выручили!!!!!!
Arhat109
Сообщения: 61
Зарегистрирован: 2016.11.23, 09:06
Откуда: из СССР

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение Arhat109 »

Гуглите "фасетный поиск" .. типовая задача уже давно.
Все чаще Историки находят следы древней и очень высокоразвитой Цивилизации, со странными буквами .. СССР
never0more7
Сообщения: 9
Зарегистрирован: 2020.09.24, 12:57

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

Arhat109 писал(а): 2020.10.09, 19:50 Гуглите "фасетный поиск" .. типовая задача уже давно.
Понял, спасибо, буду читать!
never0more7
Сообщения: 9
Зарегистрирован: 2020.09.24, 12:57

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

never0more7 писал(а): 2020.10.09, 16:55
unknownby писал(а): 2020.10.09, 16:36
never0more7 писал(а): 2020.10.09, 15:54 Да, совершенно верно, так нужно! Обновил пост, добавил код моделей и контроллеров! Помогите, пожалуйста!( уже голову поломал как вывести бренды эти(
Что насчет этого? Пойдет?

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

    public function actionView($id)
    {
        $id = Yii::$app->request->get('id');
        $category = Cat::find()->where(['id' => $id])->one();
        if(!$category){
            throw new NotFoundHttpException('Такой категории не существует');
        }

        //Все что выше, можно заменить этим
        //А то какие-то получения из ГЕТ, потом поиски и проверка на что-то.
        $model = $this->findModel($id);
        
        //тут видимо поиск всех товаров, который можно исправить
        //убираем all()
        $prod = Prod::find()->where(['category_id' => $id]);
        
        //Теперь у нас есть запрос, который можно использовать по разному.
        //Сгруппируем по бренду и запишем идентификаторы брендов в массив
        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }
        
        //Теперь тут бренды только тех продуктов, которые выпадают под нужную категорию
        $brnd = Brnd::find()->where(['in', 'brand_id', $brands])->all(); 

        return $this->render('view', [
            'model' => $model, //тут возвращаем нужную нам модель
            'prod' => $prod->all(), //тут пропишем вывод всех
            'category' => $category,
            'brnd' => $brnd,
        ]);
    }
    
    //Метод findModel должен быть примерно таким
    protected function findModel($id)
    {
        if (($model = Cat::findOne($id)) !== null) {
            return $model;
        } else {
            throw new HttpException(404, 'The requested page does not exist.');
        }
    }
Итого выйдет такой action

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

    public function actionView($id)
    {
        $model = $this->findModel($id);

        $prod = Prod::find()->where(['category_id' => $id]);

        $brands = [];
        foreach($prod->groupBy('brand_id')->all() as $value){
        	$brands[] = $value->brand_id;
        }

        return $this->render('view', [
            'model' => $model,
            'prod' => $prod->all(),
            'category' => $category,
            'brnd' => Brnd::find()->where(['in', 'brand_id', $brands])->all(),
        ]);
    }
Дорогой вы мой спаситель! Спасибо Вам большое!!!!! Вы меня очень выручили!!!!!!
А скажите, пожалуйста, а как правильно получить категории для бренда теперь!?
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение unknownby »

never0more7 писал(а): 2020.10.12, 09:42 А скажите, пожалуйста, а как правильно получить категории для бренда теперь!?
Все зависит только от того, что есть в модели, контроллере и представлении.
Грубо говоря, в представлении есть панель фильтров (слева), которая отображает список брендов, которые есть у товаров. Которые в свою очередь отображаются (справа). При выборе в списке брендов чего-нибудь, правая сторона меняется.
При этом правая сторона (товары) отображается через какой-то виджет или просто самописный foreach.
Учитываем еще вот что, при выборе в левой панели фильтров разных брендов и т.п., происходит ajax-запрос или при нажатии на кнопку. Будет ли перезагружаться страница или товары будут отображаться без перезагрузки страницы. Опять же Ajax или просто открытие action-а с параметрами в GET или POST.
Много вопросов, прежде чем ответить на простой вопрос "как правильно получить категории для бренда?" ;)
Если поможете с этими вопросами, можно что-то придумать :)
never0more7
Сообщения: 9
Зарегистрирован: 2020.09.24, 12:57

Re: Как можно получить бренды которые есть у товаров этой категории?

Сообщение never0more7 »

unknownby писал(а): 2020.10.12, 10:21
never0more7 писал(а): 2020.10.12, 09:42 А скажите, пожалуйста, а как правильно получить категории для бренда теперь!?
Все зависит только от того, что есть в модели, контроллере и представлении.
Грубо говоря, в представлении есть панель фильтров (слева), которая отображает список брендов, которые есть у товаров. Которые в свою очередь отображаются (справа). При выборе в списке брендов чего-нибудь, правая сторона меняется.
При этом правая сторона (товары) отображается через какой-то виджет или просто самописный foreach.
Учитываем еще вот что, при выборе в левой панели фильтров разных брендов и т.п., происходит ajax-запрос или при нажатии на кнопку. Будет ли перезагружаться страница или товары будут отображаться без перезагрузки страницы. Опять же Ajax или просто открытие action-а с параметрами в GET или POST.
Много вопросов, прежде чем ответить на простой вопрос "как правильно получить категории для бренда?" ;)
Если поможете с этими вопросами, можно что-то придумать :)
Постараюсь описать что нужно, а вы уже скажите, на сколько это возможно и может, подскажите, что и как…
Есть, например категория «Столы и стулья» (url данной категории namesite.com/catalog/ctoly-i-stulya )
Изображение

Слева фильтра товаров, мне нужно чтобы например когда человек выбрал производителя «Puff» то он получил товары у которых бренд «Puff» (и url у него стал в заголовке namesite.com/catalog/ctoly-i-stulya/brand-puff) я так понимаю в form методом post получать данные нужно…
Изображение

Вот копия примера то что нужно: https://www.demookay.com/catalog/ctoly-i-stulya

У меня есть в БД таблицы это: "features" и "features_value" которые сгенерированы с помощью Gii
Изображение
Изображение
ну и 2 связывающие таблицы это с категориями и с товарама!
Ответить