Symfony 如何对多个两个表使用count

Symfony 如何对多个两个表使用count,symfony,doctrine-orm,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",i

我有两个阶级,他们之间有着千丝万缕的联系

书桌

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");
但我想知道他们发行了多少书

我想我应该用count这个句子,但我不确定是否可以用count

当你用两张桌子的时候


如何创建它?

一旦拥有了
AuthorData
对象,只需调用类似
$AuthorData->getBookIds()->count()之类的函数即可

count
Doctrine\Common\Collections\ArrayCollection
的一种方法(它只使用php的
count

我假设您的实体设置正确,有适当的getter、setter、remover和constructor

public function __construct()
{
    $this->bookIds = new ArrayCollection();
}

…等等。

一旦您拥有了
AuthorData
对象,只需调用类似
$AuthorData->getBookIds()->count()之类的函数即可。

count
Doctrine\Common\Collections\ArrayCollection
的一种方法(它只使用php的
count

我假设您的实体设置正确,有适当的getter、setter、remover和constructor

public function __construct()
{
    $this->bookIds = new ArrayCollection();
}

…等等。

我可以想出两种解决方案

第一个是保存author表中的books\u count

class Author
{
    @ORM\Column(type="integer")
    private $booksCount;

    public function __construct()
    {
         $this->booksCount = 0;
    }
}
如果使用此解决方案,则必须确保在添加或删除书籍时增加或减少BookCount

第二种解决方案是使用DQL

$query = $em->createQuery('SELECT a, COUNT(b.id) FROM AcmeTopBundle:AuthorData a JOIN a.bookIds b GROUP BY b.id');
$result = $query->getScalarResult();

如果您真正关心性能,那么应该使用第一种解决方案。否则,第二种解决方案就足够了。

我可以想出两种解决方案

第一个是保存author表中的books\u count

class Author
{
    @ORM\Column(type="integer")
    private $booksCount;

    public function __construct()
    {
         $this->booksCount = 0;
    }
}
如果使用此解决方案,则必须确保在添加或删除书籍时增加或减少BookCount

第二种解决方案是使用DQL

$query = $em->createQuery('SELECT a, COUNT(b.id) FROM AcmeTopBundle:AuthorData a JOIN a.bookIds b GROUP BY b.id');
$result = $query->getScalarResult();

如果您真正关心性能,那么应该使用第一种解决方案。否则,第二种解决方案就足够了。

这也是一种好方法,谢谢,但我有点害怕,我忘记删除或删除…这也是一种好方法,谢谢,但我有点害怕,我忘记删除或删除…如果有很多作者要迭代,请小心延迟加载。对->getBookIds的一次调用将向数据库发送一个查询。@wlzch很好的调用。是的,如果你在数千人之间循环,这不是一个好主意。但是,如果他必须为这本书的书名增色,他也会如愿以偿。不是吗?哦,我想在上面的评论中加上@praxmatig。抱歉,如果你有很多作者要迭代,请小心延迟加载。对->getBookIds的一次调用将向数据库发送一个查询。@wlzch很好的调用。是的,如果你在数千人之间循环,这不是一个好主意。但是,如果他必须为这本书的书名增色,他也会如愿以偿。不是吗?哦,我想在上面的评论中加上@praxmatig。很抱歉