我有两个类,它们的关系是许多
预订表
class BookData
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORMManyToMany(targetEntity="AcmeTopBundleEntityAuthorData",inversedBy="authorIds")
* @ORMJoinTable(name="author_book")
* )
*/
private $authorIds;
作者表
class AuthorData
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToMany(targetEntity="BookData", mappedBy="authorIds", cascade={"persist"})
*/
private $bookIds;
一本书的行可以有多个$authorID。
我得到了至少出版过一本书的作者名单。
$query = $em->createQuery(
"SELECT a FROM AcmeTopBundle:AuthorData a JOIN a.bookIds");
但我想知道他们发行了多少书。
我认为我应该使用计数语句,不过,我不确定是否可以使用计数
当你使用两张桌子时。
你是怎么做到的?
一旦有了AuthorData
对象,只需调用类似$authorData->getBookIds()->count()
的东西
count
是DoctrineCommonCollectionsArrayCollection
(只使用php的count
)的一种方法
我假设您的实体设置正确,具有适当的getter、setter、remover和构造函数。。。
public function __construct()
{
$this->bookIds = new ArrayCollection();
}
等等
我可以想出两个解决方案。
第一种是将books_count保存在author表中。
class Author
{
@ORMColumn(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();
如果您真的关心性能,那么应该使用第一种解决方案。否则,第二个解决方案就足够了。