Я хочу, чтобы все отмеченные пользователем сообщения. Как игнорировать, если повторяется пост с таким же идентификатором? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть эти 5 таблиц Users, Tags, Posts, UserTag, PostTag. Я хочу получить все отмеченные сообщения пользователей. Я получаю все сообщения от

В контроллере

$tags = Auth::user()->tags;

, переходящих к представлению.

В поле зрения.

@foreach($tags as $tag)
  @foreach($tag->posts as $post)
    {{$post->title}}...
    ....
  @endforeach
@endforeach

И чем я осознаю это, я получаю повторные посты. при создании сообщения пользователь добавляет несколько тегов, за которыми следует аутентифицированный пользователь. например, что я хочу сделать:

  1. user1 добавил post1, следуя тегам test1, test2.
  2. , следующий user2 имеетследуя тегам test1 и test2, он увидит все посты, которые он отметил.
  3. Но если user1 имел один пост с двумя тегами в точке 1, то, очевидно, при получении сообщения по тегамтот, кто следовал обоим тегам (test1, test2), получит повторный пост, то есть post1.

как игнорировать повторный пост? Надеюсь, что меня беспокоит, понятно?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Вы можете добиться этого, используя различные методы.

отношение whereHas

Получение сообщений с отношением whereHas вместо первого извлечения тегов приведет к тому, что вам придется выполнять только один циклуникальный массив.

$posts = Posts::whereHas('tags', function (Builder $query) {
    $query->whereIn('id', Auth::user()->tags->pluck('id')->toArray());
});

Теперь вы выбираете только актуальные сообщения, не получив сначала ненужные теги.

О запросах отношений можно прочитать в документации Laravel.

"Сквозные" -отношения

Laravel также предоставляет удобный (да) способ запроса этого, определяя дополнительные отношения типа , имеет множество через .

/**
 * Get all of the tagged posts for this user
 */
public function taggedPosts()
{
   return $this->hasManyThrough('App\Post', 'App\Tag');
}

Вы должны определить это в пользовательской модели (вероятно, User.php).

Теперь вы можете просто просмотреть Auth::user()->taggedPosts, например,

@foreach (Auth::user()->taggedPosts as $post)
{{ $post->title }}
@endforeach

Подробнее вдокументация Laravel.

0 голосов
/ 07 октября 2019

Вы можете сохранить список идентификаторов, которые уже отображаются, и проверить их в цикле. Если идентификатор находится в массиве, то @continue до следующего, в противном случае отобразите и сохраните идентификатор. Подробнее о циклах в Laravel вы можете прочитать в документации

Я бы попытался убрать эту логику из поля зрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...