В репозитории одной из моделей доменов моего расширения я пытался добавить ограничение в список объектов связанной модели, , используя свойство этой связанной модели. Единственное рабочее решение, которое я нашел, было использовать метод репозитория связанной модели. Но мне было интересно, есть ли более эффективный способ, особенно в том случае, если мне нужно только количество связанных объектов.
Мои модели Поля исследований и Группы исследований. Они связаны с m: n. У групп есть флаг «группа выпускников»: если отмечен (alumni_group == 1)
, они все еще публикуются c (hidden == 0)
, но они не должны появляться ни в списке групп области исследований, ни считаться.
I попытался добавить ограничения в список FieldsRepository
и показать методы следующим образом (пример show()
method):
/**
* @param int $field
* @return array An array of objects, empty if no objects found
*/
public function show($field = 0)
{
$query = $this->createQuery();
$fieldConstraint = $query->equals('uid', $field);
$activeConstraint = $query->equals('researchgroups.alumniGroup', 0);
$query = $query->matching(
$query->logicalAnd($fieldConstraint, $activeConstraint)
);
return $query->execute();
}
researchgroups
- это имя свойства Fields, которое содержит отношение.
Это привело к правильному запросу базы данных, оставленному соединением таблицы MM и таблицы исследовательских групп. Но свойство researchgroups
по-прежнему содержало все группы, включая группы, помеченные как выпускники.
Способ, которым я сделал это, заключается в использовании метода GroupsRepository->listByField()
в методах действия FieldsController
и перезаписи researchgroups
свойство:
<?php
namespace Vendor\Extension\Controller;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
class FieldsController extends ActionController
{
/* ... */
/**
* @TYPO3\CMS\Extbase\Annotation\Inject
* @var \Vendor\Extension\Domain\Repository\FieldsRepository
*/
protected $fieldsRepository = NULL;
/**
* @TYPO3\CMS\Extbase\Annotation\Inject
* @var \Vendor\Extension\Domain\Repository\GroupsRepository
*/
protected $groupsRepository = NULL;
/* ... */
/**
* @param \Vendor\Extension\Domain\Model\Fields $fields
* @return void
*/
public function showAction(\Vendor\Extension\Domain\Model\Fields $fields = null)
{
$fields->researchgroups = $this->groupsRepository->listByField($fields);
$this->view->assign('field', $fields);
}
}
Но это не очень эффективно. Специально для FieldsController->listAction()
, в котором мне нужно только это для получения правильного количества связанных групп для каждого поля.
Есть ли более эффективный способ go непосредственно в FieldsRepository
?