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: Если логика хештегов (структура БД и т.п) правильная как возможно оптимизировать запрос в БД?



