У меня есть сообщение сущности и точки, связанные отношением oneToMany. Я хочу сделать метод, который будет возвращать объекты с наибольшим количеством связанных комментариев. Является ли это возможным? Пожалуйста, помогите, я понятия не имею.
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/ordered-associations.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;
}
...




Предполагая, что вы уже можете вернуть сообщение с его баллами, вы можете попробовать что-то вроде этого:
в 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();
NB: не тестировалось
Это рабочий (для меня) код
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();
почти нормально,
[Semantical Error] line 0, col 9 near 'post, count(pt.points)': Error: Class App\Entity\Post has no field or association named post