@AlexWeb6667
Web-дизайнер с опытом FullStack разработки

Как правильно получать данные из таблиц связанных многие к многим?

Друзья, не подскажите как правильно составить запрос, что бы AJAX-ом получить данные из таблиц связанных одной общей (связь многие к многим).

Я передаю AJAX-ом id хештега, и ищу в транзитной(связной) таблице id-шники всех новостей, потом с массивом этих айдишников пытаюсь достать из таблицы новостей все новости, с данными id (Пока что не могу составить правильный запрос, чтоб одним запросом, выбрать новости, с указанными id);

Не подскажите как? Или, вообще, может все проще, и можно без велосипеда? вот код
if (Yii::$app->request->post('hesh_id')) {

//id хештега
                $id = Yii::$app->request->post('hesh_id');

//id новостей с таким хештегом (из связной таблицы)
                $news_tags = NewsTags::find()->select('news_id')->where(['tags_id' => $id])->all();

//Запихиваю все в один массив
                foreach ($news_tags as $news_tag)
                    {
                         $news_id[] = $news_tag->news_id;
                     }


//Привожу к виду 1, 2, 3
                $comma_separated = implode(",", $news_id);

//И делаю запрос 
                $news = News::find()->where(['in', 'id', [$comma_separated]])->all();

                 return debug($news);


Вот такая корявая конструкция выводит новость только с первым id-шником;

Сильно не ругайтесь, с подобными запросами Where, in и подобными первый раз общаюсь как и таблицы многие ко многим связываю.

Не подскажите как по проще через id тега ко всем ихним новостям добраться?
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
@AlexWeb6667 Автор вопроса
Web-дизайнер с опытом FullStack разработки
Короче не знаю сделал ли хуже) Но решил дело так, обратной связью.
if (Yii::$app->request->isAjax) {

            if (Yii::$app->request->post('hesh_id')) {

                $id = Yii::$app->request->post('hesh_id');

                $tags_id = Tags::findOne($id);

                $this->layout = false;
                return $this->render('ajax', compact('tags_id'));

            }

        }


а во вьюхе, вывел через связь все новости данного тега.

<?php $news = $tags_id->news ?>


<?php foreach ($news as $new): ?>

        <?php $main_img = $new->getImage()->getUrl(); ?>

<div class="news_container">
    <div  class="news_img_cont" style="background: url('<?= $main_img ?>') center center no-repeat;background-size: cover;"><!--*/
/**/
/*        --><img class="news_layout" id="news_lu" src="/web/img/bg/map_frame_lu.svg" alt=""><!--*/
/*        --><img class="news_layout" id="news_lb" src="/web/img/bg/map_frame_lb.svg" alt=""><!--*/
/*        --><img class="news_layout" id="news_rb" src="/web/img/bg/map_frame_rb.svg" alt=""><!--*/
/*        --><img class="news_layout" id="news_ru" src="/web/img/bg/map_frame_ru.svg" alt=""><!--*/
/*        --><div data-id = "*/<?//= $new->id ?><!--" class="fade_new"></div>-->
         </div>

    <div class="text_container">
    <h1 class="title_new"><?= $new->name ?></h1>
    <div class="tags_news">
        <img src="/web/img/ICO/news/tag.svg" alt="" >
        <?php $tags_c = count($new->tags); if ($tags_c == 0): ?>

            <span >Разное</span>


        <?php else: ?>

            <? $i = 0; ?>
            <?php foreach ($new->tags as $tag):?>
                <span  data-id = "<?= $tag->id ?>"><?= $tag->name ?><?=count($new->tags) != ++$i ? "," : ""?></span>
            <?php endforeach; ?>

        <?php endif; ?>
    </div>
    <p class="text_news"><?php $text = $new->description ?>
        <?php if (strlen($text)>280)
        {
            $text = substr ($text, 0,strpos ($text, " ", 280)); echo $text . " ...";
        }
        else echo $text; ?>
    </p>

        <span class="data"> <?php Yii::$app->formatter->locale = 'ru-RU';
            echo Yii::$app->formatter->asDate($new->date); // выведет: 1 января 2014 г. ?></span>
    </div>
</div>

<?php endforeach; ?>


кому в друг пригодиться может...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы