如何使用count to manytomany两个表

时间:2013-12-07 16:10:28

标签: symfony doctrine-orm

我有两个有很多关系的班级

书桌

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");

但是我想要发布多少本书。

我认为我应该使用计数句,但我不确定是否可以使用计数

当你使用两张桌子时。

你怎么能做到?

2 个答案:

答案 0 :(得分:2)

获得AuthorData个对象后,只需拨打$authorData->getBookIds()->count()

countDoctrine\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();

如果你真的关心性能,你应该使用第一个解决方案。否则,第二种解决方案绰绰有余。