Hi everyone and thanks for reading me, I have a OneToMany relationship on these 2 entities:
-
Article
-
ArticleLikes
<?php
namespace App\Entity;
use App\Repository\ArticleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=ArticleRepository::class)
*/
class Article
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @ORM\Column(type="text")
*/
private $content;
/**
* @ORM\Column(type="datetime_immutable")
*/
private $createdAt;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="articles")
* @ORM\JoinColumn(nullable=false)
*/
private $relation;
/**
* @ORM\OneToMany(targetEntity=ArticleLikes::class, mappedBy="article")
*/
private $articleLikes;
public function __construct()
{
$this->articleLikes = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getRelation(): ?User
{
return $this->relation;
}
public function setRelation(?User $relation): self
{
$this->relation = $relation;
return $this;
}
/**
* @return Collection|ArticleLikes[]
*/
public function getArticleLikes(): Collection
{
return $this->articleLikes;
}
public function addArticleLike(ArticleLikes $articleLike): self
{
if (!$this->articleLikes->contains($articleLike)) {
$this->articleLikes[] = $articleLike;
$articleLike->setArticle($this);
}
return $this;
}
public function removeArticleLike(ArticleLikes $articleLike): self
{
if ($this->articleLikes->removeElement($articleLike)) {
// set the owning side to null (unless already changed)
if ($articleLike->getArticle() === $this) {
$articleLike->setArticle(null);
}
}
return $this;
}
/**
* @param User $user
* @return bool
*/
public function isLikedByUser(User $user): bool
{
foreach ($this->getArticleLikes() as $like)
{
if ($like->getUser() === $user) {
return true;
}
}
return false;
}
}
<?php
namespace App\Entity;
use App\Repository\ArticleLikesRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=ArticleLikesRepository::class)
*/
class ArticleLikes
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Article::class, inversedBy="articleLikes")
* @ORM\JoinColumn(nullable=false)
*/
private $article;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="articleLikes")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\Column(type="datetime_immutable")
*/
private $createdAt;
public function getId(): ?int
{
return $this->id;
}
public function getArticle(): ?Article
{
return $this->article;
}
public function setArticle(?Article $article): self
{
$this->article = $article;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
The 'article' entity can contain a collection of likes.
In the like entity, each like is linked to an article (articleId) as well as to a user field (userId).
To retrieve the number of likes for each article, I have a method in the 'article' entity:
/ **
* @return Collection | ArticleLikes []
* /
public function getArticleLikes (): Collection
{
return $ this-> articleLikes;
}
I am lost because I would like to create a query that allows you to retrieve the last 10 articles the most liked (with the most of 'ArticleLike's). I don't know if I need to do a left join or something else. Pleas can u help to do this query ?
Thanks :)
I want to retrieve the 10 articles that have the most 'articleLikes'.
see image if that can help : [1]: https://i.stack.imgur.com/jfMom.png
source https://stackoverflow.com/questions/70128622/i-try-to-create-a-custom-querybuilder-with-symfony
Comments
Post a Comment