gpt4 book ai didi

php - Doctrine createQueryBuilder 多条件 where 语句有点笨拙

转载 作者:可可西里 更新时间:2023-11-01 07:40:05 24 4
gpt4 key购买 nike

我有一个 itemid 和一个类别 id,它们都是有条件的。如果没有给出,则所有项目都显示为最新的拳头。如果给出了 itemid,则仅显示 id 低于给定 id 的项目(用于分页)。如果给出类别 ID,则仅显示特定类别中的项目,如果同时给出两者,则仅显示特定类别的项目,其中显示项目 ID 小于 itemid 的项目(下一页的项目)。

因为参数是有条件的,所以在构建 SQL 字符串时,您会得到很多取决于参数的 if 语句(伪代码,我正在用 php 的东西耗尽我的美元符号):

if itemid ' where i.iid < :itemid '
if catid
if itemid
' and c.id = :catid'
else
' where c.id = :catid'
end if
end if

如果给出更多可选参数,这将变得非常困惑,所以我想我应该试试 createQueryBuilder。希望是这样的:

    if($itemId!==false){
$qb->where("i.id < :id");
}
if($categoryId!==false){
$qb->where("c.id = :catID");
}

可悲的是,事实并非如此,最后将在哪里 overwrite the first one

我想到的是这个(在 Symfony2 中):

private function getItems($itemId,$categoryId){
$qb=$this->getDoctrine()->getRepository('mrBundle:Item')
->createQueryBuilder('i');
$arr=array();
$qb->innerJoin('i.categories', 'c', null, null);
$itemIdWhere=null;
$categoryIdWhere=null;
if($itemId!==false){
$itemIdWhere=("i.id < :id");
}
if($categoryId!==false){
$categoryIdWhere=("c.id = :catID");
}
if($itemId!==false||$categoryId!==false){
$qb->where($itemIdWhere,$categoryIdWhere);
}
if($itemId!==false){
$qb->setParameter(':id', $itemId);
}
if($categoryId!==false){
$arr[]=("c.id = :catID");
$qb->setParameter(':catID', $categoryId);
}
$qb->add("orderBy", "i.id DESC")
->setFirstResult( 0 )
->setMaxResults( 31 );

我并不完全信任 $qb->where(null,null),尽管它目前没有产生错误或意外结果。看起来这些参数被忽略了。在文档中找不到任何内容,但空字符串会生成错误 $qb->where('','')

它对我来说还是有点笨拙,如果我可以使用多个 $qb->where(condition) 那么每个可选的只需要一个 if 语句 $qb-> where(condition)->setParameter(':name', $val);

那么问题来了:有没有更好的办法?

我想如果 doctrine 有转义字符串的功能,我可以摆脱第二轮 if 语句(不确定恶意用户是否可以使用允许 sql 注入(inject)的不同字符集发布内容):

private function getItems($itemId,$categoryId){
$qb=$this->getDoctrine()->getRepository('mrBundle:Item')
->createQueryBuilder('i');
$arr=array();
$qb->innerJoin('i.categories', 'c', null, null);
$itemIdWhere=null;
$categoryIdWhere=null;
if($itemId!==false){
$itemIdWhere=("i.id < ".
someDoctrineEscapeFunction($id));
}

感谢您阅读到这里,希望您能赐教。

[更新]

我目前使用的是虚拟 where 语句,因此可以使用 andWhere 添加任何其他条件语句:

    $qb->where('1=1');// adding a dummy where
if($itemId!==false){
$qb->andWhere("i.id < :id")
->setParameter(':id',$itemId);
}
if($categoryId!==false){
$qb->andWhere("c.id = :catID")
->setParameter(':catID',$categoryId);
}

最佳答案

如果你想使用更通用的方法来处理这个问题,你可以创建过滤器。Doctrine 2.2 具有一个过滤系统,允许开发人员将 SQL 添加到查询的条件子句中

阅读更多关于 filters 的信息但是,我正在以与您展示的类似方式处理此问题

关于php - Doctrine createQueryBuilder 多条件 where 语句有点笨拙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18717563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com