TYPO3扩展:相关领域模型对象的约束(m:n关系)

时间:2020-01-09 10:44:14

标签: typo3 extbase

在我扩展程序的一个域模型的存储库中,我试图使用该相关模型的属性向该相关模型的对象列表中添加约束。我发现的唯一可行的解​​决方案是使用相关模型的存储库方法。但是我想知道是否有一种更有效的方法,特别是在我只需要多个相关对象的情况下。

我的模型是研究领域研究组。它们与m:n有关。这些组具有标记“ alumni group”:如果选中(alumni_group == 1),它们仍然是公共(hidden == 0),但既不应该出现在研究领域的组列表中也不应该被计数。

我尝试将约束添加到FieldsRepository列表中,并显示如下所示的方法(示例show()方法):

/**
 * @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(),我只需要为每个字段返回正确数量的相关组即可。

有没有更有效的方法可以直接进入FieldsRepository

0 个答案:

没有答案