【问题标题】:Is there a way to search in Extbase and the TYPO3 query builder for words which have a "&shy" inside?有没有办法在 Extbase 和 TYPO3 查询生成器中搜索里面有“&shy”的单词?
【发布时间】:2020-07-31 14:41:56
【问题描述】:

我的问题是后端用户可以设置带有"­" 字符的单词,例如“Test&shy ;labor”。 如果有人使用带有“Testlabor”一词的前端搜索,将找不到匹配项。 在 extbase 存储库中,我使用了这个:

$query->like('name', '%' . $searchWord . '%')

我可以把它改成这样:

$query->statement("SELECT * FROM table WHERE hidden = 0 AND REPLACE(name,'­', '') LIKE '%$searchWord%'")

然后会找到这个词,但我必须检查框架通常所做的所有事情,比如检查它是否被隐藏和删除以及更复杂,如果结果在正确的站点树中。现在我只得到与搜索词匹配的所有内容。

有没有更好的方法来搜索包含 "­" 的单词?我可以在 TYPO3 查询生成器中使用类似的东西吗?

非常感谢。

【问题讨论】:

    标签: typo3 extbase typo3-9.x


    【解决方案1】:

    你可以试试QueryBuilder接口

        public function findShy($searchWord)
        {
    
            /** @var ConnectionPool $pool */
            $pool = GeneralUtility::makeInstance(ConnectionPool::class);
            $connection = $pool->getConnectionForTable('table');
    
            $queryBuilder = $connection->createQueryBuilder();
    
            $query = $queryBuilder
                ->select('*')
                ->from('table')
                ->where("REPLACE(name,'­', '') like :name")
                ->setParameter('name', "%{$searchWord}%");
    
            // for debug only
            echo($query->getSQL());
            print_r($query->getParameters());
    
            return $query->execute()->fetchAll();
        }
    

    并在某个地方调用它,即在您的控制器中:

    DebuggerUtility::var_dump(
        $this->yourRepository->findShy('Testlabor'), 
        'findShy() sample'
    );
    

    它将创建一个带有命名参数的查询,例如(当然根据您的 TCA):

    SELECT *
    FROM `table`
    WHERE (REPLACE(name, '­'­, '') like :name)
      AND ((`table`.`deleted` = 0) AND (`table`.`hidden` = 0) AND
           (`table`.`starttime` <= 1596363840) AND
           ((`table`.`endtime` = 0) OR (`table`.`endtime` > 1596363840)))
    

    注意返回带有记录的关联数组不是模型的映射对象。

    可选

    如果您仍然需要映射模型对象,您可以混合使用这两种解决方案,即首先使用QueryBuilder 仅选择记录中的pids,然后使用实现QueryInterfaceQuery 获取它们,如下所示:

    public function findShy2($searchWord)
    {
    
        /** @var ConnectionPool $pool */
        $pool = GeneralUtility::makeInstance(ConnectionPool::class);
        $connection = $pool->getConnectionForTable('table');
    
        $queryBuilder = $connection->createQueryBuilder();
    
        $preQuery = $queryBuilder
            ->select('uid')
            ->from('table')
            ->where("REPLACE(name,'&shy;', '') like :name")
            ->setParameter('name', "%{$searchWord}%");
    
        // for debug only
            echo($query->getSQL());
            print_r($query->getParameters());
    
        $uids = [];
        foreach ($preQuery->execute()->fetchAll() as $item) {
            $uids[] = $item['uid'];
        }
    
        if(count($uids) > 0){
            $interfaceQuery = $this->createQuery();
            $interfaceQuery->matching(
                $interfaceQuery->in('uid', $uids)
            );
    
            return $interfaceQuery->execute();
        }
    
        return [];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多