Я пытаюсь создать пользовательский конструктор запросов с помощью Symfony

#php #symfony #doctrine #query-builder

Вопрос:

У меня есть множество отношений с этими 2 сущностями:

  • Article
  • ArticleLikes
 lt;?php  namespace AppEntity;  use AppRepositoryArticleRepository; use DoctrineCommonCollectionsArrayCollection; use DoctrineCommonCollectionsCollection; use DoctrineORMMapping as ORM;  /**  * @ORMEntity(repositoryClass=ArticleRepository::class)  */ class Article {  /**  * @ORMId  * @ORMGeneratedValue  * @ORMColumn(type="integer")  */  private $id;   /**  * @ORMColumn(type="string", length=255)  */  private $title;   /**  * @ORMColumn(type="text")  */  private $content;   /**  * @ORMColumn(type="datetime_immutable")  */  private $createdAt;   /**  * @ORMManyToOne(targetEntity=User::class, inversedBy="articles")  * @ORMJoinColumn(nullable=false)  */  private $relation;   /**  * @ORMOneToMany(targetEntity=ArticleLikes::class, mappedBy="article")  */  private $articleLikes;   public function __construct()  {  $this-gt;articleLikes = new ArrayCollection();  }   public function getId(): ?int  {  return $this-gt;id;  }   public function getTitle(): ?string  {  return $this-gt;title;  }   public function setTitle(string $title): self  {  $this-gt;title = $title;   return $this;  }   public function getContent(): ?string  {  return $this-gt;content;  }   public function setContent(string $content): self  {  $this-gt;content = $content;   return $this;  }   public function getCreatedAt(): ?DateTimeImmutable  {  return $this-gt;createdAt;  }   public function setCreatedAt(DateTimeImmutable $createdAt): self  {  $this-gt;createdAt = $createdAt;   return $this;  }   public function getRelation(): ?User  {  return $this-gt;relation;  }   public function setRelation(?User $relation): self  {  $this-gt;relation = $relation;   return $this;  }   /**  * @return Collection|ArticleLikes[]  */  public function getArticleLikes(): Collection  {  return $this-gt;articleLikes;  }   public function addArticleLike(ArticleLikes $articleLike): self  {  if (!$this-gt;articleLikes-gt;contains($articleLike)) {  $this-gt;articleLikes[] = $articleLike;  $articleLike-gt;setArticle($this);  }   return $this;  }   public function removeArticleLike(ArticleLikes $articleLike): self  {  if ($this-gt;articleLikes-gt;removeElement($articleLike)) {  // set the owning side to null (unless already changed)  if ($articleLike-gt;getArticle() === $this) {  $articleLike-gt;setArticle(null);  }  }  return $this;  }   /**  * @param User $user  * @return bool  */  public function isLikedByUser(User $user): bool  {  foreach ($this-gt;getArticleLikes() as $like)  {  if ($like-gt;getUser() === $user) {  return true;  }  }  return false;  } }  
 lt;?php  namespace AppEntity;  use AppRepositoryArticleLikesRepository; use DoctrineORMMapping as ORM;  /**  * @ORMEntity(repositoryClass=ArticleLikesRepository::class)  */ class ArticleLikes {  /**  * @ORMId  * @ORMGeneratedValue  * @ORMColumn(type="integer")  */  private $id;   /**  * @ORMManyToOne(targetEntity=Article::class, inversedBy="articleLikes")  * @ORMJoinColumn(nullable=false)  */  private $article;   /**  * @ORMManyToOne(targetEntity=User::class, inversedBy="articleLikes")  * @ORMJoinColumn(nullable=false)  */  private $user;   /**  * @ORMColumn(type="datetime_immutable")  */  private $createdAt;   public function getId(): ?int  {  return $this-gt;id;  }   public function getArticle(): ?Article  {  return $this-gt;article;  }   public function setArticle(?Article $article): self  {  $this-gt;article = $article;   return $this;  }   public function getUser(): ?User  {  return $this-gt;user;  }   public function setUser(?User $user): self  {  $this-gt;user = $user;   return $this;  }   public function getCreatedAt(): ?DateTimeImmutable  {  return $this-gt;createdAt;  }   public function setCreatedAt(DateTimeImmutable $createdAt): self  {  $this-gt;createdAt = $createdAt;   return $this;  } }  

Article Сущность может содержать коллекцию ArticleLikes .

В ArticleLikes сущности, каждое подобное связано с Article ( articleId ), а также с полем пользователя ( userId ).

Чтобы получить количество лайков для каждой статьи, у меня есть метод в Article сущности:

 / **  * @return Collection | ArticleLikes []  * / public function getArticleLikes (): Collection {  return $ this-gt; articleLikes; }  

Я потерялся, потому что хотел бы создать запрос, который позволит вам получить последние 10 статей, которые вам больше всего понравились (с большинством из ArticleLikes них ). Я не знаю, нужно ли мне присоединиться слева или что-то еще. Как я могу выполнить этот запрос?

Я хочу получить 10 статей, в которых больше ArticleLikes всего .

Изображение: 1

Комментарии:

1. Одна из ваших правок, похоже, содержит решение. Пожалуйста, опубликуйте это в качестве ответа, чтобы другие могли извлечь из этого пользу и показать, что вы решили свою проблему.

Ответ №1:

Решение состояло в том, чтобы поставить:

 -gt;orderBy('count(al)', 'DESC')  

Конструктор запросов, который получает 10 наиболее понравившихся статей:

 /**  * @return array  * get the 10 most liked articles  */ public function findArticlesMostLiked(): array {  return $this-gt;createQueryBuilder('a')  -gt;select( 'a')  -gt;join('a.articleLikes', 'al')  -gt;groupBy('al.article')  -gt;orderBy('count(al)', 'DESC')  -gt;setMaxResults(10)  -gt;getQuery()  -gt;getResult()  ; }