Doctrine - 从反面查询一对多,单向与 Join Table 关联
Doctrine - Query One-To-Many, Unidirectional with Join Table association from inversed side
我的目标是:
创建通用关联,其中第一个实体 (例如类别) 可以多次用于其他对象 (例如 Post,文章)
例子
Post有分类,Article也有分类,但Article和Post是完全不同的实体。 (两者不能同时连接)
映射示例:
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;
}
如您所见,这是一对多、单向的连接 Table 关联。
现在,我 可以 查询单个 Post
类别和 Article
类别,但类别不知道 Post 或文章。这很好,因为我可以重复使用 Category
。
哪里有问题?
我需要加载 ALL Posts
或 Articles
其中包含单个 Category
或 Categories
.
例子
我们有 20 个 Post 类别名为 "symfony"
(id:2) 和 10 个类别名为 "doctrine"
(id:3)。现在我需要查询以加载类别为 "doctrine"
的所有 Post
findPostsByCategoryId( $id );
// findPostsByCategoryId( 3 );
或所有Post具有两个类别
findPostsByCategories( Array $array );
// findPostsByCategories( array(2,3) );
我该怎么做?
我需要这个案例的解决方案或实现我的目标的解决方案。
感谢每个提示。
P.S。我还有其他与这里描述的映射相关的问题
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();
我的目标是:
创建通用关联,其中第一个实体 (例如类别) 可以多次用于其他对象 (例如 Post,文章)
例子
Post有分类,Article也有分类,但Article和Post是完全不同的实体。 (两者不能同时连接)
映射示例:
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;
}
如您所见,这是一对多、单向的连接 Table 关联。
现在,我 可以 查询单个 Post
类别和 Article
类别,但类别不知道 Post 或文章。这很好,因为我可以重复使用 Category
。
哪里有问题?
我需要加载 ALL Posts
或 Articles
其中包含单个 Category
或 Categories
.
例子
我们有 20 个 Post 类别名为 "symfony"
(id:2) 和 10 个类别名为 "doctrine"
(id:3)。现在我需要查询以加载类别为 "doctrine"
findPostsByCategoryId( $id );
// findPostsByCategoryId( 3 );
或所有Post具有两个类别
findPostsByCategories( Array $array );
// findPostsByCategories( array(2,3) );
我该怎么做?
我需要这个案例的解决方案或实现我的目标的解决方案。 感谢每个提示。
P.S。我还有其他与这里描述的映射相关的问题
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();