l-6ren">
gpt4 book ai didi

TYPO3 FileReference 存储库查询通过文件名搜索

转载 作者:行者123 更新时间:2023-12-01 02:11:33 24 4
gpt4 key购买 nike

我制作了一个“文档”模型,其中包含一个"file"字段,它是一个 FileReference。现在我正在研究一个存储库查询函数,该函数检索文件名中包含特定字符串的所有文档(为此使用 $query->like() )。但是我遇到了以下错误:

enter image description here

当我禁用这个 $query->like 并调试我收到的“文档”时,它看起来像关于字段“uidLocal”的关系信息是正确的,因为我收到了文件的名称。

enter image description here

我正在使用更多代码:

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 模型似乎不是以这种方式实现的。

也许解决方法是创建一个返回 uid 的自定义 sql 查询,然后使用 ->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 FileReference 存储库查询通过文件名搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53765835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com