Получить счетчик отношения TYPO3 Extbase mm

63
8

Мы создали простую связь мм между такими моделями:

<?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. Есть ли более легкий способ получить этот счет, чем позвонить всем связанным пользователям и посчитать их?

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

Представьте список сообщений с ~ 30000 понравится каждый. Сценарий начинает создавать 30000 объектов в памяти. Мне кажется, что мне кажется, что мне кажется, что стол за номером номера кажется мне более реалистичным. Но как?

спросил(а) 2021-01-28T00:44:15+03:00 3 месяца, 1 неделя назад
1
Решение
76

Репозитории Extbase получили countAll()/countByProperty() по умолчанию. Вы также можете добавить свои собственные функции в репозиторий, чтобы просто вернуть количество объектов любого запроса.

Вы можете попробовать что-то подобное в своем контроллере:

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

Это требует, чтобы ваша модель-пользователи получили что-то вроде свойства backreference (например, "понравившиеся") для всех сообщений, которые понравились пользователю.

Изменение: свойство popularPosts-пользователей также должно быть Objectstorage. Из-за этого функция countByXy по умолчанию, возможно, не работает, потому что Objectstorages требует содержать() -constraints в репозитории. Поэтому вам, возможно, придется добавить свою собственную функцию в userRespository - что-то вроде этого:

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

ответил(а) 2021-01-28T00:44:15+03:00 3 месяца, 1 неделя назад
63

Если ваша озабоченность здесь связана с производительностью, вы можете подумать о переопределении своей модели отношений. TYPO3 сохраняет поля отношений для MM-отношений в объектах, которые автоматически поддерживают количество связанных объектов. Затем вы можете написать настраиваемый запрос, который разрешает фактическое содержимое столбца, которое будет представлять собой количество понравившихся. Heres сообщение в блоге как хорошая отправная точка о том, как это сделать.

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


Вам также нужно понимать ленивые отношения загрузки, так как, судя по вашей текущей модели, отношение к пользователям не является ленивым, а это означает, что Extbase будет стимулировать всех этих пользователей для каждого загружаемого вами сообщения.

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

ответил(а) 2021-01-28T00:44:15+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема