Symfony показывает новейшие посты, кроме открытых на данный момент - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть шаблон, который отображает новые сообщения. Если я открою один пост из них, он все еще показывает его. Мне нужно либо получить идентификатор открытого в данный момент сообщения из URL, либо каким-либо образом отфильтровать сообщение в контроллере или с помощью построителя запросов. Я не буду сейчас давать код, потому что я не знаю, что вам нужно, чтобы помочь мне. Пожалуйста, попросите дополнительный код, если это необходимо. Спасибо

1 Ответ

1 голос
/ 06 ноября 2019

Зависит от того, как вы получаете новые сообщения. Есть несколько возможностей.

  1. Вы можете отфильтровать в виде ветки:

Действие:

public function viewPost(Request $request, EntityManager $em): Response
{

    $postId = $reqeust->get('id');
    $post = $em->getRepository(Post::class)->find($postId);
    $newestPosts = $em->getRepository(Post::class)->findAll();

    return $this->render('Post/view.html.twig', [
        'post'          => $post,
        'newestPosts'   => $newestPosts
    ]);
}

представление:

{% for newPost in newestPosts if newPost.id != post.id %}
<h2>{{ newPost.title}}</h2>
{% endfor %}
Если вы используете построитель запросов в объекте хранилища, вы можете добавить параметр «exclude»:

Действие:

public function viewPost(Request $request, EntityManager $em): Response
{

    $postId = $reqeust->get('id');
    $post = $em->getRepository(Post::class)->find($postId);
    $newestPosts = $em->getRepository(Post::class)->findNewPosts(7, $postId);

    return $this->render('Post/view.html.twig', [
        'post'          => $post,
        'newestPosts'   => $newestPosts
    ]);
}

Репозиторий:

<?php

namespace App\Repository;

use App\Entity\Post;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
 * ProductRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class PostRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Product::class);
    }

    public function findNewPosts($days, $postId)
    {
        $date = new \DateTime();
        $date->modify('-'.$days.' day');

        $query = $this->createQueryBuilder('p');

        return $query->where('p.id <> :requestPost')
            ->andWhere('p.datetime >= :requestDatetime')
            ->setParameter('requestProduct', $postId)
            ->setParameter('requestDatetime', $date);
            getQuery()->getResult()
    }
}
...