我们在模型之间创建了一个简单的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个对象。询问帖子表中的数字对我来说听起来更加真实。但是如何?
答案 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