获取TYPO3 Extbase mm关系计数

时间:2017-06-06 15:03:35

标签: php mysql typo3 extbase

我们在模型之间创建了一个简单的mm关系:

<?php
namespace VENDOR\COMPANY\Domain\Model;

class Posts extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{

//..

 /**
   * users
   *
   * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VENDOR\COMPANY\Domain\Model\Users>
   */
   protected $likedBy = null;

 //..

}

MySQL数据库创建一个新的mm表,并在users表中创建一个计数器列..domain_post。是否有#34;打火机&#34;获得此计算的方法比调用所有相关用户并计算它们?

$amountLikes = $post->getLikedBy()->count();

想象一下每个约30000个喜欢的帖子列表。该脚本开始在内存中构建30000个对象。询问帖子表中的数字对我来说听起来更加真实。但是如何?

2 个答案:

答案 0 :(得分:2)

Extbase存储库默认获得countAll()/ countByProperty()。您还可以将自己的函数添加到存储库,以便只返回任何查询的对象计数。

您可以在控制器中尝试这样的事情:

$amountLikes = $this->usersRepository->countByLikedPosts($anyPost);

这要求您的用户模型为用户喜欢的所有帖子提供类似反向引用属性(如“likesPosts”)的内容。

编辑: 用户的likesPosts-property也必须是Objectstorage。因此,默认的countByXy函数可能不起作用,因为Objectstorages需要包含() - 存储库中的约束。所以你可能需要将自己的函数添加到usersRespository中 - 如下所示:

public function countByLikedPost($post) {
    $query = $this->createQuery();
    return $query->matching($query->contains('likedPosts',$post))->count();
}

答案 1 :(得分:1)

如果您关注的是性能,您可能需要考虑重新定义关系模型。 TYPO3为自动维护相关实体数量的实体中的MM关系保留关系字段。然后,您可以编写一个自定义查询来解析实际的列内容,这将是喜欢的数量。这篇博客文章是关于如何做到这一点的一个很好的起点。

http://lbrmedia.net/codebase/Eintrag/extbase-bidirektionale-mm-relation/

您还需要了解延迟加载关系,因为根据您当前的模型判断,与用户的关系并不是懒惰,这意味着Extbase将为您加载的每个帖子实例化所有这些用户。

https://docs.typo3.org/typo3cms/ExtbaseFluidBook/5-Domain/2-implementing-the-domain-model.html