如何对多张两张表使用count



我有两个类,它们的关系是许多

预订表

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() 的东西

countDoctrineCommonCollectionsArrayCollection(只使用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();

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

相关内容

  • 没有找到相关文章

最新更新