YII2.0 查询构建器 的使用

╰半橙微兮° 2022-05-11 03:42 374阅读 0赞
  1. // DAO(Data Access Object) 数据访问对
  2. // 查询构建器 的使用
  3. // 主要的好处是:
  4. //
  5. // 1, 允许以面向对象方式建立一个复杂的SQL表达式
  6. // 2,自动引用表明和列名来 防止跟SQL保留关键字以及特殊字符的冲突
  7. // 3,引用参数值,使用参数绑定,从而降低了SQL 注入攻击的风险。
  8. $status = isset($_POST['status'])?$_POST['status']:null;
  9. // 联合方式 UNION / UNION ALL
  10. $subQuery_1 = (new Query())->select("id")->from("order");
  11. $subQuery_2 = (new Query())->select("id")->from("order");
  12. $subQuery_1->union($subQuery_2,true);// 第二个参数设置 true 则使用 UNION ALL
  13. $subQuerySql = $subQuery_1->createCommand()->getRawSql();// 输出SQL
  14. $rawSql = $subQuery_1->createCommand()->rawSql;// SQL语句 已绑定查询参数 与getRawSql()一样
  15. $sql = $subQuery_1->createCommand()->sql;// SQL语句 参数使用占位符代替
  16. $params = $subQuery_1->createCommand()->params;// 获取绑定的参数
  17. $results = $subQuery_1->all();// 执行查询
  18. // 使用子查询(必须是Query查询对象) 其结果是: SELECT id FROM ($subQuerySql) AS tmp_table;
  19. $subSql1 = (new Query())->select('id')->from(['tmp_table' => $subQuery_1]);// tmp_table 是别名
  20. $subSql2 = (new Query())->select('id')->from('user')->where(['=','username','张三'])->one();
  21. $query = (new Query())->select('id,username')
  22. ->from('tableName')
  23. ->where('1=1');
  24. $query->addSelect('age');// 追加查询字段 SELECT id,username,age
  25. $query->addSelect(['address,phone']);// SELECT id,username,address,phone
  26. // JOIN => LEFT / RIGHT / INNER
  27. $query->join('LEFT JOIN','order','order.user_id = tableName.id');
  28. $query->leftJoin('order', 'order.user_id = tableName.id');
  29. $query->leftJoin(['orderList' => $subQuery_2], 'orderList.user_id = tableName.id');// LEFT JOIN ($subQuery_2) AS orderList ON orderList.user_id = tableName.id
  30. // AND
  31. $query->andWhere(['in','sub_id',$subSql1]);// AND sub_id IN ($subSql1)
  32. $query->andWhere(['sub_id',$subSql1]);// AND sub_id IN ($subSql1)
  33. $query->andWhere(['=','user_id',$subSql2]);// AND user_id = $subSql2
  34. // AND OR
  35. $query->andWhere(['and','id=1','id=3']);// AND (id=1 AND id=3)
  36. $query->andWhere(['or','id=1','id=3']);// AND (id=1 or id=3)
  37. $query->andWhere(['and','id=1',['or','id=2','id=3']]);// AND id=1 AND (id=2 OR id=3)
  38. // OR AND
  39. $query->orWhere(['id' => 1,'username' => 'abc']);// OR ( id=1 AND username='abc' )
  40. $query->orWhere(['and', ['>','id',10],['username' => 'abc']]);// OR ( id>10 AND username='abc' )
  41. // 判断记录是否存在 EXISTS / NOT EXISTS
  42. $subQuery_3 = (new Query())->select("id")
  43. ->from("tableNameSub")
  44. ->where("tableNameSub.id=tableName.sub_id");
  45. $query->andWhere(['exists',$subQuery_3]);// EXISTS 第二个参数必须是 Query查询实例
  46. // LIKE / AND LIKE / OR LIKE
  47. $query->andWhere(['like','tableName.name','abc']);// AND tableName.name LIKE '%abc%'
  48. $query->andWhere(['like','tableName.name','abc%',false]);// AND tableName.name LIKE 'abc%'
  49. $query->andWhere(['like','tableName.name',['abc','def']]);// AND (tableName.name LIKE '%abc%' AND tableName.name LIKE '%def%')
  50. $query->andWhere(['like','tableName.name',['abc','def%'],false]);// AND (tableName.name LIKE 'abc' AND tableName.name LIKE 'def%')
  51. $query->andWhere(['or like','tableName.name',['abc','def']]);// AND (tableName.name LIKE '%abc%' OR tableName.name LIKE '%def%')
  52. // 绑定查询参数(过滤用户输入,防止SQL 注入的攻击)
  53. $query->andWhere('status=:status',[':status' => $status]);
  54. $query->andWhere('status=:status')->addParams([':status' => $status]);
  55. // BETWEEN / NOT BETWEEN
  56. $query->andWhere(['between','id',2,5]);// AND id BETWEEN 2 AND 5
  57. // andFilterWhere() :会过滤为空的查询
  58. $query->andWhere(['username' => '','age' => '22']);// AND username='’AND age=22
  59. $query->andFilterWhere(['username' => '','age' => '22']);// AND age=22 其中 username=''被过滤
  60. // ORDER BY
  61. $query->orderBy(['id' => SORT_ASC, 'username' => SORT_DESC]);
  62. $query->orderBy('id ASC, username DESC');
  63. $query->orderBy('id ASC')->addOrderBy('username DESC');// 追加排序方式
  64. // GROUP BY
  65. $query->groupBy(['id', 'status']);
  66. $query->groupBy('id, status');
  67. $query->groupBy(['id', 'status'])->addGroupBy('age');// 追加分组方式
  68. // HAVING
  69. $query->having(['status' => 1]);
  70. $query->having(['status' => 1])->andHaving(['>', 'age', 30]);// 追加 HAVING 条件
  71. // LIMIT
  72. $query->limit(10)->offset(20);// LIMIT 20,10
  73. // indexBy 查询结果集的索引
  74. $query->indexBy('username');// 将把 username 字段的值作为数组的键名
  75. $query->indexBy(function($row){ return $row['id'].'-'.$row['username'];});// 将把 id-username 连在一起作为 键名
  76. // 查询方法
  77. $query->all();// 所有记录
  78. $query->one();// 结果集第一条记录
  79. $query->column();// 返回第一列的值
  80. $query->scalar();// 结果集的第一行第一列的标量值
  81. $query->exists();// 结果是否存在
  82. $query->count();// 记录条数
  83. // 其他拓展
  84. // 获取大量数据时 使用 batch 或 each 方法代替 all 方法
  85. //(前两者可以节省时间和内存,以前一直认为一次查询所有数据肯定比分批查询快,看来我错了,查询方式不一样处理的机制可能不一样)
  86. $query = (new Query())->from('user');
  87. foreach($query->batch() as $user){
  88. echo $user['username'];
  89. echo "<br/>";
  90. }
  91. foreach($query->each() as $user){
  92. echo $user['username'];
  93. echo "<br/>";
  94. }
  95. // batchInsert 批量插入数据
  96. $result = Yii::$app->db->createCommand()
  97. ->batchInsert('tableName',['username','age'],[
  98. ['张三','21'],
  99. ['李四','22'],
  100. ['王五','25']
  101. ]
  102. )->execute();
  103. // insert 插入单条记录
  104. $result = Yii::$app->db->createCommand()
  105. ->insert("user", ['username' => '将军','age' => '36'])
  106. ->execute();

发表评论

表情:
评论列表 (有 0 条评论,374人围观)

还没有评论,来说两句吧...

相关阅读

    相关 yii2时间范围查询

    1.时间范围这个应该都不陌生 但是你要注意你的模型里面只有你数据库的规定字段,现在你需要的是通过两个值即两个字段去查询这一个值所在的范围 2.那么就需要你在模型中定义两