Php 获取TYPO3 Extbase mm关系计数

Php 获取TYPO3 Extbase mm关系计数,php,mysql,typo3,extbase,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\

我们在以下模型之间创建了一个简单的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;

 //..

}

想象一下一个帖子列表,每个帖子大约有30000个喜欢的人。脚本开始在内存中构建30000个对象。向posts表询问数字对我来说更现实。但是如何?

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

您可以在控制器中尝试以下操作:

$amountLikes = $this->usersRepository->countByLikedPosts($anyPost);
这要求您的用户模型对用户喜欢的所有帖子都有类似于backreference属性(如“likedPosts”)的内容

编辑: 用户的likedPosts属性也必须是Objectstorage。因此,默认countByXy函数可能无法工作,因为Objectstorages要求存储库中包含()约束。因此,您可能需要将自己的函数添加到usersRespository中—类似于这样:

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

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

您可以在控制器中尝试以下操作:

$amountLikes = $this->usersRepository->countByLikedPosts($anyPost);
这要求您的用户模型对用户喜欢的所有帖子都有类似于backreference属性(如“likedPosts”)的内容

编辑: 用户的likedPosts属性也必须是Objectstorage。因此,默认countByXy函数可能无法工作,因为Objectstorages要求存储库中包含()约束。因此,您可能需要将自己的函数添加到usersRespository中—类似于这样:

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

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

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


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

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


如果计算已执行语句的数量,extbase仍将为每个匹配的实体构造一个extbase对象。但是,如果您只调用count而不首先执行查询,则情况并非如此,如文档中所述。@j4k3感谢这个重要建议j4k3-我编辑了上面的答案。如果您计算执行的语句,extbase仍将为每个匹配的实体构造一个extbase对象。但是,如果您只调用count而不首先执行查询,则情况并非如此。@j4k3感谢这个重要建议j4k3-我编辑了上面的答案。