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

3
我已经创建了一个包含'file'字段的“文档”模型,该字段是FileReference。现在我正在编写一个仓库查询函数,该函数检索所有包含特定字符串的文件名的文档(使用$query->like()实现)。但是我遇到了以下错误:

enter image description here

每当我禁用这个 $query->like 并调试接收到的“document”时,看起来关于字段“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.'.%')
        )
    );

现在我当然可以在查询后过滤文档名称,但这对任务的性能不利。有人知道我漏掉了什么,错误来自哪里吗?
提前感谢您的贡献想法, Falko

你能否将你在仓库中的 query->like() 语句添加到你的问题中? - digijay
@digijay 更新了我的问题并添加了正在执行的 $query。 - user1456158
1个回答

1
我猜你是在尝试类似这样的东西吗?
$query = $this->createQuery();
$query->matching($query->like('file.uidLocal.name', '%somefile%'));

我不确定您是否可以通过Extbase查询从sys_file_reference加入到sys_file。对我来说,看起来TCA或FileReference模型没有以这种方式实现。

也许一个解决方法是创建一个自定义的SQL查询,返回uids,然后使用类似于“->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();
    }

谢谢您的回复,这个解决方法可能可行,但我想避免使用自定义 SQL 查询。 - user1456158

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接