我学习学说。 我在多对多的关系中有两个实体文章和类别,我试图让所有类别都不是特定的文章。
ArticleEntity:
class Article extends BaseEntity
{
use Identifier;
/**
* @ORM\Column(type="string", nullable = false, unique=TRUE)
* @var string
*/
private $title;
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="articles")
* @ORM\JoinTable(name="article_categories")
*/
private $categories;
public function getCategories()
{
return $this->categories;
}
public function __construct()
{
$this->categories = new \Doctrine\Common\Collections\ArrayCollection();
}
和CategoryEntity:
class Category extends BaseEntity
{
use Identifier;
/**
* @ORM\Column(type="string", nullable = false, unique=true)
* @var string
*/
private $title;
/**
* @ORM\Column(type="string",nullable=false,unique=true)
* @var sting
*/
private $slug;
/**
* @ORM\ManyToMany(targetEntity="Article", mappedBy="categories")
*/
private $articles;
public function __construct()
{
$this->articles = new \Doctrine\Common\Collections\ArrayCollection();
}
我正试图在没有具体文章的情况下获得所有类别。在纯MySQL中,id会是这样的:
SELECT * FROM category LEFT JOIN article_categories ON category.id = article_categories.category_id WHERE article_categories.article_id <> 1(for example) AND article_id IS NOT NULL
我可以在我的CategoryRepository中创建的唯一解决方案就是这个。
public function findWithoutArticle($article_id)
{
$articleCat = $this->em->find(Article::getClassName(), $article_id);
$qb = $this->em->createQueryBuilder();
$qb->select('c')
->from(Category::getClassName(), 'c')
->where('c.id NOT IN (:article_id)')
->setParameter('article_id', $articleCat->getCategories()->toArray());
return $qb->getQuery()->getResult();
}
这看起来不对。有没有更好的“学说方式”练习?
答案 0 :(得分:0)
这个怎么样?
$qb = $this->em->createQueryBuilder();
$qb->select('c');
$qb->from('Category', 'c');
$qb->leftJoin('c.articles', 'a');
$qb->where($qb->expr()->neq('a.article_id', '?1'));
$qb->setParameter(1, $article_id);
$categories = $qb->getQuery()->getResult();
答案 1 :(得分:0)
这个怎么样:
public function findWithoutArticle($article_id)
{
$qb = $this->em->createQueryBuilder()
->select('c')
->from('Category', 'c')
->leftJoin('c.article', 'a')
->where('a.article_id <> :articleId')
->setParameter('articleId', $article_id);
return $qb->getQuery()->getResult();
}