Доктрина Symfony SortBy ToMany объекты отношений - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть сущность и точки, которые связаны отношением oneToMany.Я хочу сделать метод, который будет возвращать объекты с наибольшим количеством связанных комментариев.Является ли это возможным?Пожалуйста, помогите, я понятия не имею.

https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / tutorials / order-association.html - следуетя использую это?

сущностей: сообщение:

/**
 * @ORM\Entity(repositoryClass="App\Repository\PostRepository")
 */
class Post
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var Points
     * @ORM\OneToMany(targetEntity="Points", mappedBy="post", fetch="EAGER")
     */
    private $points;

    /**
     * @return Collection|Points[]
     */
    public function getPoints(): Collection {
        return $this->points;
    }

...

очков

/**
 * @ORM\Entity(repositoryClass="App\Repository\PointsRepository")
 */
class Points
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var Post
     * @ORM\ManyToOne(targetEntity="Post", inversedBy="points",  fetch="EAGER")
     */
    private $post;

    public function getPost(): Post {
        return $this->post;
    }

    public function setPost(Post $post ){
        $this->post = $post;
    }
...

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Это рабочий (для меня) код

        return $this->createQueryBuilder('p')
            ->innerJoin('p.user', 'c')
            ->innerJoin('p.points', 'pp')
            ->andWhere("p.date > '".$now->format("Y-m-d H:i:s")."'")
            ->setMaxResults($max)
            ->groupBy('pp.post')
            ->orderBy('pp.post','DESC')
            ->getQuery()
            ->getResult();
0 голосов
/ 02 февраля 2019

Предполагая, что вы уже можете вернуть сообщение с его точками, вы можете попробовать что-то вроде этого:

в App \ Repository \ PostRepository:

public function postsByPoints() {
    return $this->getEntityManager()->createQueryBuilder()
        ->select('p.post, count(pt.points) N)
        ->from('App:Points', 'pt')
        ->join('pt.post', 'p')
        ->where('some where clause') <- delete this if you're not selecting a subset
        ->groupBy('p.post')
        ->orderBy('N')
        ->getQuery()->getResult();
}

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

$em = $this->getDoctrine()->getManager();
$postsByPoints = $em->getRepository('App:Post')->postsByPoints();

Примечание: не проверено

...