php – Doctrine – 查询一对多,单向与来自反向的连接表关联

我的目标是:

创建通用关联,其中第一个实体(例如,类别)可以多次用于其他对象(例如,帖子,文章)

帖子有类别,文章有类别,但文章和帖子是完全不同的实体. (两者不能同时连接)

映射示例:

岗位

<?php
/** @Entity */
class Post
{
    // ...

    /**
     * @ManyToMany(targetEntity="Category")
     * @JoinTable(name="post_categories",
     *      joinColumns={@JoinColumn(name="post_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $categories;

    public function __construct()
    {
        $this->categories= new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

文章

<?php
/** @Entity */
class Article
{
    // ...

    /**
     * @ManyToMany(targetEntity="Category")
     * @JoinTable(name="article_categories",
     *      joinColumns={@JoinColumn(name="article_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id", unique=true)}
     *      )
     */
    private $categories;

    public function __construct()
    {
        $this->categories= new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

类别

<?php
/** @Entity */
class Category
{
    // ...
    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $name;
}

正如您所看到的,这是One-To-Many,单向连接表关联.
现在,我可以查询单个帖子类别和文章类别,但类别不了解帖子或文章.这很好,因为我可以重复使用Category.

哪里有问题?

我需要加载包含单个类别或类别的所有帖子或文章.

我们有20个帖子,其中的类别名为“symfony”(id:2),10个帖子的类别名为“doctrine”(id:3).现在我需要查询加载所有类别“doctrine”的帖子

findPostsByCategoryId( $id );
// findPostsByCategoryId( 3 );

或所有两个类别的帖子

findPostsByCategories( Array $array );
// findPostsByCategories( array(2,3) );

我怎样才能做到这一点?

我需要针对此案例或解决方案的解决方案来实现我的目标.
每个提示都很受欢迎.

附:我在这里描述的映射还有其他相关问题

Validate UniqueEntity for One-To-Many, Unidirectional with Join Table

最佳答案
除非我误读你的问题,否则这看起来很简单:

获取具有特定类别的所有帖子:

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select('p')
    ->from('SomeBundle:Post', 'p')
    ->join('p.categories', 'c')
    ->where('c.id = :categoryId')
    ->setParameter('categoryId', $categoryId)
    ->getQuery()
    ->getResult();

获取包含各种类别的所有帖子:

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select('p')
    ->from('SomeBundle:Post', 'p')
    ->join('p.categories', 'c')
    ->where($qb->expr()->in('c.id', ':categoryIds'))
    ->setParameter('categoryIds', $categoryIds) // array of ids
    ->getQuery()
    ->getResult();

转载注明原文:php – Doctrine – 查询一对多,单向与来自反向的连接表关联 - 代码日志