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。很抱歉