我制作了一个“文档”模型,其中包含一个字段“文件”,即FileReference。现在,我正在使用一个存储库查询功能,该功能检索文件名中包含某些字符串的所有文档(为此使用$ query-> like())。但是我遇到以下错误:
每当我禁用此$ query-> like并调试接收到的“文档”时,看起来有关字段“ uidLocal”的关系信息都是正确的,因为我收到了文件名。
我使用了更多代码:
class FileReference extends \TYPO3\CMS\Extbase\Domain\Model\FileReference
{
/**
* @var \**\***\Domain\Model\File
*/
protected $uidLocal;
/**
* @param \**\***\Domain\Model\File $uidLocal
* @return void
*/
public function setUidLocal($uidLocal)
{
$this->uidLocal = $uidLocal;
}
/**
* @return \**\***\Domain\Model\File
*/
public function getUidLocal()
{
return $this->uidLocal;
}
}
存储库查询:
$query->matching(
$query->logicalAnd(
$query->greaterThanOrEqual('crdate', $from),
$query->contains('usergroups', $participant),
// TODO: Onderstaande check moet aan maar resulteerd in error..
$query->like('file.uidLocal.name', '%'.$filename.'_'.$type.'.%')
)
);
现在,我当然可以在查询后过滤文档名称,但这对于执行任务来说效果不佳。有谁知道我缺少什么以及错误来自哪里?
预先感谢您提供的想法,
法尔科
最佳答案
我想您正在尝试类似的事情?
$query = $this->createQuery();
$query->matching($query->like('file.uidLocal.name', '%somefile%'));
我不确定是否可以使用extbase查询从sys_file_reference加入sys_file。
对我来说,看起来TCA或FileReference模型不是那样实现的。
也许一种解决方法是创建一个自定义sql查询,返回返回的uid,然后使用-> findAllByUids($ uids)之类的方法创建文档模型。
这是一个使用query builder而不是extbase查询的工作示例。
class ArticleRepository extends Repository
{
public function findAllByFilename($filename)
{
/* @var $queryBuilder \TYPO3\CMS\Core\Database\Query\QueryBuilder */
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable('tx_example_domain_model_article');
$queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class));
$res = $queryBuilder
->select('article.uid')
->from('tx_example_domain_model_article', 'article')
->leftJoin('article', 'sys_file_reference', 'reference',
$queryBuilder->expr()->andX(
$queryBuilder->expr()->eq('reference.uid_foreign', $queryBuilder->quoteIdentifier('article.uid')),
$queryBuilder->expr()->eq('reference.tablenames', $queryBuilder->quote('tx_example_domain_model_article')),
$queryBuilder->expr()->eq('reference.fieldname', $queryBuilder->quote('image')),
$queryBuilder->expr()->eq('reference.table_local', $queryBuilder->quote('sys_file'))
))
->leftJoin('article', 'sys_file', 'file',
$queryBuilder->expr()->eq('file.uid', $queryBuilder->quoteIdentifier('reference.uid_local'))
)
->where($queryBuilder->expr()->eq('file.name', $queryBuilder->createNamedParameter($filename)))
->execute();
debug($queryBuilder->getSQL());
$uids = [];
while ($row = $res->fetch()) {
$uids[] = $row['uid'];
}
return $this->findAllByUids($uids);
}
public function findAllByUids($uids) {
$query = $this->createQuery();
$query->matching($query->in('uid', $uids));
return $query->execute();
}
关于typo3 - TYPO3 FileReference存储库查询通过文件名进行的搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53765835/