学说2 - 如何在没有特定文章

时间:2015-09-15 19:32:12

标签: php mysql doctrine-orm

我学习学说。 我在多对多的关系中有两个实体文章和类别,我试图让所有类别都不是特定的文章。

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();
}

这看起来不对。有没有更好的“学说方式”练习?

2 个答案:

答案 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();
}