在TYPO3 Extbase Repository中使用声明和喜欢一起使用

时间:2013-10-09 16:26:27

标签: repository typo3

以下功能有效。但我想一起使用“声明”和“喜欢”。如果我用constraint1注释掉这一行并尝试使用:

$constraint1 = $query->statement("SELECT * FROM pages WHERE title LIKE '" . $text . "%'");

...查询不起作用。

我收到了一个错误:

1:PHP Catchable Fatal Error:参数1传递给TYPO3 \ CMS \ Extbase \ Persistence \ Generic \ Qom \ QueryObjectModelFactory :: _或()必须实现接口TYPO3 \ CMS \ Extbase \ Persistence \ Generic \ Qom \ ConstraintInterface,instance给出了TYPO3 \ CMS \ Extbase \ Persistence \ Generic \ Query,在第439行[...]中调用,并在[...] \ typo3 \ sysext \ extbase \ Classes \ Persistence \ Generic \ Qom \ QueryObjectModelFactory.php中定义第122行

功能:

    /**
    * Test
    *
    * @param string $text
    * @return Objects
    */
    public function findWordsByText($text) {

        $query = $this->createQuery();
        $query->getQuerySettings()->setRespectStoragePage(FALSE);

        $query->getQuerySettings()->setReturnRawQueryResult(TRUE);

        $constraint1 = $query->like('title', $text . '%');
        // $constraint1 = $query->statement("SELECT * FROM pages WHERE title LIKE '" . $text . "%'");

        $constraint2 = $query->like('title', 'new');

        $constraint = array($constraint1, $constraint2);

        $query->matching(
            $query->logicalOr($constraint)
        );

        $records = $query->execute();

        return $records;
    }

如果我更改了以下内容:

    $query->matching(
        $query->logicalOr($constraint)
    );

To - logicalAnd:

    $query->matching(
        $query->logicalAnd($constraint)
    );

...查询为空。

1 个答案:

答案 0 :(得分:2)

我没有看到你的问题。您希望返回标题字段中包含术语$ text或标题字段中包含“new”的所有记录。所以只需使用一个简单的logicalOr查询:

/**
* Test
*
* @param string $text
* @return Objects
*/
public function findWordsByText($text) {

    $query = $this->createQuery();
    $query->getQuerySettings()->setRespectStoragePage(FALSE);
    $query->getQuerySettings()->setReturnRawQueryResult(TRUE);

    $query->matching(
        $query->logicalOr(
           $query->like('title', '%' . $text . '%'),
           $query->like('title', 'new')
        )
    );

    return $query->execute();
}

$ query-> statement()用于原始SQL查询,不能与createQuery结合使用。

顺便说一句,如果$ text来自POST或GET输入,请不要忘记清理输入。