yii2, система хештегов. Система хештегов как оптимизировать

Я делаю систему хештегов на сайте

У меня есть 4 таблицы:

1.user 2. history (посты) 3. hashtags 4. history_hashtags (связная таблица для history и hashtags)

Я хочу получить истории и данные такие как: user.id, user.username, user.img, history.id, history.description, history.datetime, hashtag.id, hashtag.name(но не одного, а всех хештегов которые привязаны к этой истории)

таблица user

введите сюда описание изображения

таблица history

введите сюда описание изображения

таблица hashtags

введите сюда описание изображения

таблица history_hashtags

введите сюда описание изображения

Мой контроллер где я получаю dataProvider:


        $model = new Search();
        $dataProvider = $model->historis();

        \Yii::$app->getView()->registerJsFile(Yii::$app->request->baseUrl . '/js/history.js', ['position' => \yii\web\View::POS_END, 'async'=>true, 'depends' => [\yii\web\JqueryAsset::className()]]);
        $this->getView()->registerCssFile("@web/css/index.css", ['depends' => ['frontend\assets\AppAsset']]);
        $this->getView()->registerCssFile("@web/css/post.css", ['depends' => ['frontend\assets\AppAsset']]);

        return $this->render('index', array(
            'dataProvider' => $dataProvider
        ));

метод historis:

$query = History::find()
            ->select(array(
                'history.id',
                'history.title',
                'history.user_id',
                'history.description',
                'history.datetime',
                'user.id as userId',
                'user.username',
                'user.img'
            ))
            ->leftJoin('user', 'history.user_id = user.id')
            ->joinWith(['historyHashtags'])
            ->groupBy(['history.id']);

метод getHistoryHashtags:

public function getHistoryHashtags()
    {
        return $this->hasMany(HistoryHashtags::className(), ['history_id' => 'id'])->select(['hashtag_id', 'history_id'])->joinWith('hashtag');
    }

метод hashtag:

    public function getHashtag()
    {
        return $this->hasOne(Hashtags::className(), ['id' => 'hashtag_id'])->select(['id', 'name']);
    }

В итоге я получаю данный 3 SQL запросa:

SELECT `history`.`id`, `history`.`title`, `history`.`user_id`, `history`.`description`, `history`.`datetime`, `user`.`id` AS `userId`, `user`.`username`, `user`.`img` 
FROM `history` 
LEFT JOIN `history_hashtags` ON `history`.`id` = `history_hashtags`.`history_id` 
LEFT JOIN `hashtags` ON `history_hashtags`.`hashtag_id` = `hashtags`.`id` 
LEFT JOIN `user` ON history.user_id = user.id 
GROUP BY `history`.`id` 
ORDER BY `id` DESC LIMIT 6

SELECT `hashtag_id`, `history_id` 
FROM `history_hashtags` 
LEFT JOIN `hashtags` ON `history_hashtags`.`hashtag_id` = `hashtags`.`id` 
WHERE `history_hashtags`.`history_id` IN (27, 26, 25, 24, 23, 21)

SELECT `id`, `name` 
FROM `hashtags` 
WHERE `id` IN (40, 20, 42, 69, 70, 71, 72)

Вопрос 1: Правильно ли я реализовал логику хештегов? Или можно было бы упростить её. Если да то как?

Вопрос 2: Если логика хештегов (структура БД и т.п) правильная как возможно оптимизировать запрос в БД?


Ответы (0 шт):