Расширение TYPO3: ограничение для связанных объектов модели предметной области (отношение m: n) - PullRequest
0 голосов
/ 09 января 2020

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

Мои модели Поля исследований и Группы исследований. Они связаны с 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?

...