ContactPerson与FrontendUser有关系,是关系的拥有方.现在我有以下问题:
我正在激活/停用任务中的FrontendUsers,基于活动的ContactPersons.禁用或删除FrontendUser时,contactPerson-> getFrontendUser()的结果为null,即使两个存储库都是ignoreEnableFields:
/** @var Typo3QuerySettings $querySettings */
$querySettings = $this->objectManager->get(Typo3QuerySettings::class);
$querySettings->setIgnoreEnableFields(true);
$querySettings->setRespectStoragePage(false);
$this->frontendUserRepository->setDefaultQuerySettings($querySettings);
$debugContactPerson = $this->contactPersonRepository->findOneByContactPersonIdAndIncludeDeletedAndHidden('634');
$debugFrontendUser = $this->frontendUserRepository->findOneByUid(7);
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
array(
'$debugContactPerson' => $debugContactPerson,
'$debugFrontendUser' => $debugFrontendUser,
)
);
Run Code Online (Sandbox Code Playgroud)
Ps:$this->frontendUserRepository->findByUid(7);也不起作用,因为它没有使用查询,但persistenceManager->getObjectByIdentifier(...当然忽略了查询设置.
问题是,在我的实际代码中我不能使用findOneByUid(),因为我无法在contact_person的frontend_user字段中获取整数值(uid).
没有使用原始查询来获取contact_person-row的任何方法来解决这个问题?
因为我不想编写自己的QueryFactory而且我不想在我的contactPerson中添加冗余字段,所以我现在用原始语句解决了它.也许它可以帮助有同样问题的人:
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
/**
* @param \Vendor\ExtKey\Domain\Model\ContactPerson $contactPerson
* @return Object
*/
public function findByContactPersonByRawQuery(ContactPerson $contactPerson){
$query = $this->createQuery();
$query->statement(
"SELECT fe_users.* FROM fe_users" .
" LEFT JOIN tx_extkey_domain_model_contactperson contact_person ON contact_person.frontend_user = fe_users.uid" .
" WHERE contact_person.uid = " . $contactPerson->getUid()
);
return $query->execute()->getFirst();
}
}
Run Code Online (Sandbox Code Playgroud)
表的启用字段有两个方面fe_users:
$querySettings->setIgnoreEnableFields(true);$querySettings->setEnableFieldsToBeIgnored(['disable']);看看维基页面中的一些概述 - 它说6.2,但它在7.6和8的大多数部分仍然有效.但是,这仅在直接调用存储库时有效,但如果将实体作为另一个实体的一部分进行检索则不行 - 在这种情况下,存储库不用于嵌套实体.
隐式检索嵌套实体 - 这发生在DataMapper::getPreparedQuery(DomainObjectInterface $parentObject, $propertyName).要调整子实体的查询设置,QueryFactoryInterface必须重载实现.
注册替代实现ext_localconf.php(替换\Vendor\ExtensionName\Persistence\Generic\QueryFactory为扩展的真实类名称):
$extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
\TYPO3\CMS\Extbase\Object\Container\Container::class
);
$extbaseObjectContainer->registerImplementation(
\TYPO3\CMS\Extbase\Persistence\Generic\QueryFactoryInterface::class,
\Vendor\ExtensionName\Persistence\Generic\QueryFactory::class
);
Run Code Online (Sandbox Code Playgroud)
然后在实现中:
<?php
namespace \Vendor\ExtensionName\Persistence\Generic;
use TYPO3\CMS\Extbase\Domain\Model\FrontendUser;
class QueryFactory extends \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory
{
public function create($className)
{
$query = parent::create($className);
if (is_a($className, FrontendUser::class, true)) {
// @todo Find a way to configure that more generic
$querySettings = $query->getQuerySettings();
$querySettings->setIgnoreEnableFields(true);
// ... whatever you need to adjust in addition ...
}
return $query;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |