Поиск в репозитории TYPO3 FileReference по имени файла - PullRequest
0 голосов
/ 13 декабря 2018

Я создал модель 'document', которая содержит поле '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.'.%')
        )
    );

Теперь я могу, конечно, отфильтровать имя документа после запроса, ночто не будет хорошо для выполнения задачи.Кто-нибудь знает, что мне не хватает и откуда возникает ошибка?

Заранее спасибо за внесение идей,

Falko

1 Ответ

0 голосов
/ 14 декабря 2018

Полагаю, вы пытаетесь что-то подобное?

$query = $this->createQuery();
$query->matching($query->like('file.uidLocal.name', '%somefile%'));

Я не уверен, что вы можете присоединиться из sys_file_reference к sys_file с помощью запроса extbase.Для меня это выглядит так, как будто TCA или FileReference Model не реализованы таким образом.

Возможно, обходной путь - создать собственный запрос sql, который возвращает uids, а затем создать модели вашего документа с чем-то вроде -> findAllByUids ($uids);

Вот рабочий пример, который использует построитель запросов вместо запроса 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();
    }
...