我有两个有很多关系的班级
书桌
class BookData
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\ManyToMany(targetEntity="Acme\TopBundle\Entity\AuthorData",inversedBy="authorIds")
* @ORM\JoinTable(name="author_book")
* )
*/
private $authorIds;
作者表
class AuthorData
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="BookData", mappedBy="authorIds", cascade={"persist"})
*/
private $bookIds;
一个图书行可以有多个$ authorID。
我得到了至少出版过一本书的作者名单。
$query = $em->createQuery(
"SELECT a FROM AcmeTopBundle:AuthorData a JOIN a.bookIds");
但是我想要发布多少本书。
我认为我应该使用计数句,但我不确定是否可以使用计数
当你使用两张桌子时。
你怎么能做到?
答案 0 :(得分:2)
获得AuthorData
个对象后,只需拨打$authorData->getBookIds()->count()
count
是Doctrine\Common\Collections\ArrayCollection
的一种方法(只使用php的count
)
我假设您正确设置了实体,并使用了正确的getter,setter,removers和constructors ......
public function __construct()
{
$this->bookIds = new ArrayCollection();
}
...等
答案 1 :(得分:2)
我可以想到2个解决方案。
第一个是将books_count保存在作者表中。
class Author
{
@ORM\Column(type="integer")
private $booksCount;
public function __construct()
{
$this->booksCount = 0;
}
}
如果您使用此解决方案,则必须确保在添加或删除图书时增加和减少booksCount。
第二种解决方案是使用DQL
$query = $em->createQuery('SELECT a, COUNT(b.id) FROM AcmeTopBundle:AuthorData a JOIN a.bookIds b GROUP BY b.id');
$result = $query->getScalarResult();
如果你真的关心性能,你应该使用第一个解决方案。否则,第二种解决方案绰绰有余。