Repository Extbase存储库:使用$query->;在多个模型字段中搜索术语;like()

Repository Extbase存储库:使用$query->;在多个模型字段中搜索术语;like(),repository,typo3,matching,extbase,Repository,Typo3,Matching,Extbase,我有一个产品存储库,希望集成一个搜索字段来比较产品名称和零件号 仅与名称进行比较是可行的,但我很难添加第二个字段进行比较 我有一些必须满足的条件,所以直到现在我使用logicalAnd(),这将导致searchterm与名称和零件号两者匹配 /** * action findBySearchterm * * @param \string $term * @param \boolean $isFrontend * @return object */ public function fi

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

仅与名称进行比较是可行的,但我很难添加第二个字段进行比较

我有一些必须满足的条件,所以直到现在我使用logicalAnd(),这将导致searchterm与名称和零件号两者匹配

/**
 * 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();
}
我尝试先用searchterms(通过logicalOr)匹配一个数组,然后再匹配其他条件,但没有成功

像这样:

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();
}
但这会返回所有没有过滤器的产品

非常感谢您的帮助

//编辑 根据lorenz的建议,这是目前有效的代码:

$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)
  )
);

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

Hi@lorenz!谢谢你,我能用你答案背后的逻辑使它起作用。请参见上面的新代码!干杯