我有一个产品存储库,希望集成一个搜索字段来比较产品名称和零件编号。
仅与名称进行比较工作正常,但我很难添加第二个字段进行比较。
我有一些必须满足的条件,所以直到现在我都使用逻辑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/