php - Doctrine - Query One-To-Many, Unidirectional with Join Table association from inverse side

标签 php mysql symfony doctrine-orm doctrine-query

我的目标是:

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

示例

Post 有类别,Article 也有类别,但 Article 和 Post 是完全不同的实体。 (两者无法同时连接)


映射示例:

发布

<?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;
}

如您所见,这是一对多、单向的连接表关联。 现在,我可以查询单个Post 类别和Article 类别,但Category 不知道Post 或Article。这很好,因为我可以重复使用 Category


哪里出了问题?

我需要加载包含单个 CategoryCategoriesALL PostsArticles >.

示例

我们有 20 个类别名为 "symfony" (id:2) 的帖子和 10 个类别名为 "doctrine" (id:3)。现在我需要查询以加载类别为 "doctrine"

的所有帖子
findPostsByCategoryId( $id );
// findPostsByCategoryId( 3 );

OR 具有两个类别的所有帖子

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 - Query One-To-Many, Unidirectional with Join Table association from inverse side,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34640661/

相关文章:

php - 为什么我不能使用 PHP 将我的 24 小时制转换为 12 小时制的上午/下午时间?

drupal - 使用 syslog 和 nginx/php-fpm

php - mysql 查询在 php 中不起作用?

sql - 数百个 excel 查找值到 MySQL 在线插入?

php - Symfony2 创建自己的编码器来存储密码

javascript - JS/PHP/MySQL 成功但未插入

php - 如何在值是变量的表中插入新行?

symfony - 在 symfony2 中的另一个模板中加载一个带有 ajax 的 Twig 模板

mysql - 在 MySQL 中将带有坐标的字符串分解为纬度/经度

Symfony 在 Web 文件夹中缓存 Twig 模板