- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 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/
我正在使用 Symfony2,我需要执行此 SQL,例如: select detformacion.* from detformacion left join forma
我试图在 Symfony2.3 中使用查询生成器,但我不断收到错误消息:FatalErrorException:错误:调用成员函数 createQueryBuilder() 在...第 45 行中的非
我正在使用 Typeorm结合 class-validator ,所以我定义了一个这样的实体: import { Entity, PrimaryGeneratedColumn,
在我的存储库类中,我使用: public function getItemsByTag($tag) { $qb = $this->createQueryBuilder('c')
我在执行这个 SQL 请求时遇到了麻烦: SELECT * FROM project LEFT JOIN user ON project.idAuthor=user.id WHERE project.
这很好用 SELECT * FROM podcasttags INNER JOIN podcast ON podcasttags.podcastid = podcast.id INNER JOIN t
我正在使用 Symfony 3.4 并且我在查询时遇到问题: $qb = $this->createQueryBuilder('o') ->leftJoin('o.prices', 'p',
现在我正在尝试通过将内容 ID 与用户 ID 匹配来编写查询返回用户名和内容的代码。这是我的 table 的样子。 我有两个表。 一个是用户表包含username 和userid。 另一个表是内容表,
我一直在尝试创建此 SQL 查询,但第二个参数一直出错。 也许我在这里遗漏了一些东西。 这是我的要求: $pointsTEF = $this->getDoctrine()->getManager();
我有一个实体“交易”,它有一个相关实体“客户”。我想加载与交易相关的客户。 它的工作原理如下: Repository.find({ relations: ['customer'] }); 但是我想做一
我有表实体 - 开发人员和用户。在用户中,我有三个角色 ROLE_DEVELOPER ROLE_FREELANCER 和 ROLE_COMPANY。每个起始用户的所有角色,如果这是用户中的开发人员,则
我在 MySQL 中有这个查询,我想应用到学说中 SELECT * FROM ads_list AS al LEFT JOIN (ads_category AS ac, ads_category_ma
我正在尝试这个 $results = this->get('doctrine')->getManager()->createQueryBuilder() ->select('x.a,
我有一个 itemid 和一个类别 id,它们都是有条件的。如果没有给出,则所有项目都显示为最新的拳头。如果给出了 itemid,则仅显示 id 低于给定 id 的项目(用于分页)。如果给出类别 ID
我有一个“团队”实体,其属性为“预算”。我只想打印团队属性,我希望预算最高的团队出现在第一位、第二位、第三位...(DESC)。 但是使用这段代码,它不起作用,我不明白为什么。 indexAction
你知道我怎样才能从我的 createQueryBuilder 中获取 sql 吗? 我的 Entity/DownloadRepository.php 类: public function getLa
我不知道如何让它工作。 我有: partner 表,包含字段 id 和 name 包含两个字段的 partner_address 表:id_partner 和 id_address 一个表 addre
现在我成功创建了一个函数,使用 Doctrine 的函数 createQueryBuilder 从数据库检索数据。 有人知道是否有类似的函数来插入或更新数据库?或者我如何使用createQueryBu
该代码不起作用。有谁能够帮助我?代码是: class ResultRepository extends EntityRepository { public function findAllB
我正在使用 Doctrine createQueryBuilder() 在 Symfony2 中构造查询。但是,我不想占用该实体中的所有列。如何只选择 ID 和名称? $query = $this->
我是一名优秀的程序员,十分优秀!