У меня есть простая реализация User -> Favorites User Articles:
Контроллер:
/**
* @Route("/articles/{category}/{id}/addtofavorites", name="addToFavourites")
*/
public function addToFavourites($category, $id)
{
$em = $this->getDoctrine()->getManager();
$article = $em->getRepository("AppBundle:Article")->find($id);
$user = $this->getUser();
$user = $em->getRepository("AppBundle:User")->find($user->getId());
$user->addFavouriteArticle($article);
$em->persist($user);
$em->flush();
$test = 'true';
return new JsonResponse($test);
}
Пользователь:
<?php
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
private $firstName;
/**
* @var favouriteArticles[]
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Article", cascade={"all"})
* @ORM\JoinTable(name="user_favourite_articles",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")})
*/
private $favouriteArticles;
public function __construct() {
$this->favouriteArticles = new ArrayCollection();
}
/**
* @return favouriteArticles[]
*/
public function getFavouriteArticles(): array
{
return $this->favouriteArticles->toArray();
}
/**
* @param favouriteArticles[] $favouriteArticles
*/
public function setFavouriteArticles(array $favouriteArticles): void
{
$this->favouriteArticles = $favouriteArticles;
}
/**
* Add user
*
* @param \AppBundle\Entity\Article $article
*
* @return User
*/
public function addFavouriteArticle(Article $article)
{
$this->favouriteArticles[] = $article;
return $this;
}
Таким образом, я должен изменить метод контроллера, чтобы проверить, существует ли Article в БД и снова щелкнул Favourite button
, он должен удалить его из DB (в данный момент он просто добавляет статью каждый раз). Как это сделать? Если бы это была обычная таблица, я бы добавил ее в репозиторий пользователей, например:
return (boolean)$this->createQueryBuilder('u')
->andWhere('u.article = :article')
->setParameter('article', $rticle)
->getQuery()
->getOneOrNullResult();
Но в этом случае с отношением ManyToMany я не знаю, как и где это сделать.