在我扩展程序的一个域模型的存储库中,我试图使用该相关模型的属性向该相关模型的对象列表中添加约束。我发现的唯一可行的解决方案是使用相关模型的存储库方法。但是我想知道是否有一种更有效的方法,特别是在我只需要多个相关对象的情况下。
我的模型是研究领域和研究组。它们与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
?