repository - Extbase存储库: Searching for term in multiple model fields with $query->like()

标签 repository typo3 matching extbase

我有一个产品存储库,希望集成一个搜索字段来比较产品名称和零件编号。

仅与名称进行比较工作正常,但我很难添加第二个字段进行比较。

我有一些必须满足的条件,所以直到现在我都使用逻辑And(),这将导致搜索词与名称和部件号相匹配。

/**
 * action findBySearchterm
 *
 * @param \string $term
 * @param \boolean $isFrontend
 * @return object
 */
public function findBySearchterm($term, $isFrontend) {
    $userView = $isFrontend ? 'visibleFrontend' : 'visibleBackend';

    $query = $this->createQuery();

    $matching = array(
        $query->like('name', "%$term%"),
        $query->equals($userView, 1),
        $query->equals('deleted', 0),
        $query->equals('hidden', 0),
    );

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

    $query->setOrderings(array('partno' => \TYPO3\CMS\Extbase\Persistence\Generic\Query::ORDER_ASCENDING));
    return $query->execute();
}

我尝试首先仅将数组与搜索词匹配(通过逻辑或),然后再匹配其他条件,但无济于事。

像这样:

public function findBySearchterm($term, $isFrontend) {
    $userView = $isFrontend ? 'visibleFrontend' : 'visibleBackend';

    $query = $this->createQuery();

    $searchterms = array(
        $query->like('name', "%$term%"),
        $query->like('partno', "%$term%"),
    );

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

    $criteria = array(
        $query->equals($userView, 1),
        $query->equals('deleted', 0),
        $query->equals('hidden', 0),
    );

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

    $query->setOrderings(array('partno' => \TYPO3\CMS\Extbase\Persistence\Generic\Query::ORDER_ASCENDING));
    return $query->execute();
}

但这会返回完全没有过滤器的所有产品。

非常感谢任何帮助!

//编辑 根据洛伦兹的建议,这是现在可以使用的代码:

$query->matching( $query->logicalAnd( array(
    $query->logicalOr( array(
        $query->like('name', "%$term%"),
        $query->like('partno', "%$term%"),
    ) ),
    $query->logicalAnd( array(
        $query->equals($userView, 1),
        $query->equals('deleted', 0),
        $query->equals('hidden', 0),
    ) ),
) ) );

最佳答案

您需要额外一层来比较“启用字段”和查询:

$query->matching->logicalAnd(
  $query->logicalOr(
    $query->like('name', "%$term%"),
    $query->like('partno', "%$term%")
  ),
  $query->logicalAnd(
    $query->equals($userView, 1),
    $query->equals('deleted', 0),
    $query->equals('hidden', 0)
  )
);

因此,搜索部分(名称、部分编号)和“启用字段”部分(已删除、隐藏)都需要匹配,记录才能出现在结果中。

关于repository - Extbase存储库: Searching for term in multiple model fields with $query->like(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22402456/

相关文章:

c# - 存储库模式逐步解释

typo3 - 在 TYPO3 Extbase 查询中使用 Concat

r - 查找字符串是否一次在多列中匹配并返回逻辑矩阵?

regex - 正则表达式以匹配SSH url部分

algorithm - 需要某种稳定的匹配算法

svn - SVN存储库结构

git - 下载Android源时节省空间

c# - AutoMapper.Map 忽略源对象中的所有 Null 值属性

typo3 - Extbase 查询以比较同一表中的两个字段

typo3 - 检查变量是否是流体中的数组类型