#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:
Решение состояло в том, чтобы поставить:
-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() ; }