CI 数据库使用积累
CI 数据库使用积累
一、 or_like使用
情景:WMS库存列表过滤器通过产品名称或者SKU查询。
通常此情况采用CI框架提供的or_like语句,如
|
$this->db->like(Product_model::TABLENAME . '.' .'product_name', value); $this->db->or_like(Product_model::TABLENAME.'.'.'origin_sku', value); |
但此情况如果在有用$this->db->where的时候会出现问题。如新增
|
$this->db->where(Product_model::TABLENAME . '.' .'cate_id', $value); |
实际呈现出来的sql语句是类似
|
Where 'product_name' like %value% or 'origin_sku' like %value% and 'cate_id' = value |
但我们实际想要的结果是如下
|
Where ('product_name' like %value% or 'origin_sku' like %value%) and 'cate_id' = value |
二者之间区别就是少了一对括号,所查询的结果集则不一样。
如果查询的结果集是通过上述包含括号的SQL查询语句得到的,则可以通过修改CI框架。查找到DB_active_rec.php文件中的_compile_select函数实现,修改如下:
|
// Write the "LIKE" portion of the query if (count($this->ar_like) > 0) { if (count($this->ar_where) > 0) { $sql .= "\nAND ("; } $sql .= implode("\n", $this->ar_like); if (count($this->ar_where) > 0) { $sql .= ")"; } } |
但修改此框架会导致原有功能缺失。有的用户希望得到查询的结果集就刚刚好是没有包含括号的SQL语句,则又得回滚代码。
故我们另外采用的一种方式是通过CI 框架的where语句结合sql查询语句方式。如下:
|
$left = "'%"; $right = "%'"; $sql = '(' . Product_model::TABLENAME . '.' . 'product_name like ' . $left . $value . $right . ' or ' . Product_model::TABLENAME . '.' . 'origin_sku like ' . $left . $value . $right . ')'; $this->db->where($sql, null, false); |
Where语句采用CI框架提供的第四种方式:自定义字符串方式,但注意的是where语句传参在CI框架用户指南上是有误的,使用方式应是$this->db->where($sql, null, false)。
二、 distinct使用
情景:通过过滤器查询产品名称来获取售后申请信息。售后申请信息是单独的数据表tbl_sales_order,而相应的售后申请信息所包含的产品信息则是在tbl_sales_order_products,但tbl_sales_order_product则只包含产品ID,也就是product_id,具体的产品名称需通过product_id查询tbl_products来获取。如果要通过查询产品名称来获取售后申请则需要联合售后申请信息表、售后产品表以及产品名称表。
通常采用的语句如下:
|
$this->db->from(self::TABLENAME); $this->db->join(Sales_order_products_model::TABLENAME,self::TABLENAME . '.' . 'id' . '=' . Sales_order_products_model::TABLENAME . '.' . 'sale_order_id'); $this->db->join(Product_model::TABLENAME,Sales_order_products_model::TABLENAME . '.' . 'product_id' . '=' . Product_model::TABLENAME . '.' . 'id'); if(!is_null($per_page)){ $this->db->limit($per_page, $page*$per_page); } $this->db->select(self::TABLENAME . '.' . '*'); |
上述情况在一张售后申请表对应一条产品信息的时候是可行的,但如果有一张售后申请有多条产品信息的时候,会出现多条冗余的售后申请信息,故需去掉冗余的信息,可采用CI框架提供的函数distinct。
|
$this->db->distinct(); |
三、 union使用
情景:WMS系统中要呈现一张退货单报表,包含售后退货以及拒收/未妥投订单信息。其中包含售后退货和拒收/未妥投两种业务,二者之中只存在部分字段可复用,此报表只提供通过起始时间和截止时间查询结果。这意味着在输出结果集是需要合并表单数据,可通过union字段。
正常的一种使用方式是获取两个结果集进行合并输出。如下例子:
// Query #1 $this->db->select('title, content, date');
$this->db->from('mytable1');
$query1 = $this->db->get()->result(); // Query #2 $this->db->select('title, content, date');
$this->db->from('mytable2');
$query2 = $this->db->get()->result(); // Merge both query results $query = array_merge($query1, $query2); |
但此方式在进行分页显示需要自行对数组进行处理。
第二种方式是采用网上提供的一种方式,调用_compile_select和_reset_select接口。如下:
$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get(); $subQuery1 = $this->db->_compile_select(); $this->db->_reset_select(); // #2 SubQueries no.2 ------------------------------------------- $this->db->select('title, content, date');
$this->db->from('mytable2');
$query = $this->db->get(); $subQuery2 = $this->db->_compile_select(); $this->db->_reset_select(); // #3 Union with Simple Manual Queries -------------------------- $this->db->query("select * from ($subQuery1 UNION $subQuery2) as unionTable");
// #3 (alternative) Union with another Active Record ------------ $this->db->from("($subQuery1 UNION $subQuery2)");
$this->db->get(); |
但此方式实际使用是会报错,_compile_select和_reset_select接口是保护性的,无法调用。
第三种方式则是采用CI框架提供的last_query接口,获取上述查询语句(注:不是查询结果),然后再通过query接口合并SQL语句进行查询,实际WMS采用的就是此方式,实际用例如下:
|
public function get_return_by_condition($condition=array(), $page,$per_page='10'){ $this->db->select(array('tbl_sales_order.id as id', 'order_id', 'create_date')); $this->db->from('tbl_sales_order'); $this->db->join('tbl_sales_operate_log', 'tbl_sales_order.id = tbl_sales_operate_log.sale_order_id'); $this->db->where('tbl_sales_order.product_status', 7); $this->db->where('tbl_sales_order.payment_status', 135); $this->db->where('tbl_sales_operate_log.product_status', 7); $this->db->where('tbl_sales_operate_log.payment_status', 135); $this->db->distinct(); //return $query2 = $this->db->get()->result(); $query = $this->db->get(); $subQuery1 = $this->db->last_query(); $this->db->from('tbl_purchase_order'); $this->db->join('tbl_order_stockout', 'tbl_purchase_order.id = tbl_order_stockout.order_purchase_id'); $this->db->join('tbl_order_action', 'tbl_order_action.order_id = tbl_order_stockout.order_id'); $this->db->where('tbl_order_action.mark', 1); //1表示订单状态 $this->db->where('tbl_order_action.action_status', '123'); //订单取消为123 $this->db->distinct(); $this->db->select(array('tbl_purchase_order.id as id', 'tbl_purchase_order.create_date as create_date', 'tbl_order_stockout.order_id as order_id', )); //return $this->db->get()->result(); $query = $this->db->get(); $subQuery2 = $this->db->last_query(); $sql = 'select * from ($subQuery1 UNION $subQuery2) as unionTable'; if(!is_null($per_page)){ $sql .= 'limit ' . $per_page * $page . ', ' . $per_page; } return $this->db->query($sql)->result(); } |
第四种方式采用重新CI框架,支持UNION方式,具体可参考
CI 数据库使用积累的更多相关文章
- CI数据库操作_查询构造器类
=================数据库操作======================1.数据库配置: config/database.php 用户名 密码 数据库 2 加载数据库类:$this-& ...
- CI 数据库操作总结
最简单示例 $query = $this->db->query("YOUR QUERY"); foreach ($query->result() as $row) ...
- informix数据库知识积累
一.嵌套查询 informix子查询:嵌套查询(1)select first 20 * from (select first 40 * from hlrquery_log order by id de ...
- oracle数据库语句积累
1.从一个表选出数据更新另一个表(后面的exists一定要加) update jqhdzt set shid = (select shid from v_plat_userjqinfo t where ...
- INFORMIX数据库常用命令
INFORMIX数据库常用命令 一.onstat命令集 1.onstat - 说明:查看数据库当前的状态 用法:onstat - 2.onstat -c 说明:查看数据库的配置文件 用法:ons ...
- 数据库子查询和join的比较
子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作.子查询虽然很灵活,但是执行效率并不高. select goods_id,goods_name from go ...
- CentOS6.5配置PHP CI程序
步骤: 1.安装CentOS6.5系统: 1.选择PHP+Mysql环境 2.关闭防火墙和SeLinux 1.chkconfig --level 35 iptables off ...
- CodeIgniter学习笔记一:基本结构、控制器、视图、超级对象、数据库
一.基本结构 CodeIgniter3.0.0解压后有8个文件,分别是: application:项目文件 system:系统(框架)文件,为方便升级,不建议修改 user_guid:用户手册,不需要 ...
- 积累——SQLCommand命令
SQLcommand表示要对SQL数据库运行的一个 T-SQL 语句或存储过程.以便运行大量操作或处理数据库结构. 在对数据库訪问的时候,就经经常使用到这个.看看它是怎么做到的吧! 一.属性 Comm ...
随机推荐
- 【WPF】学习笔记(一)——做一个简单的电子签名板
参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...
- Java实现压缩文件与解压缩文件
由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或 ...
- stl_container容器和std_algorithm算法相同的函数
八.算法和容器中存在的功能相同的函数: 8.1.array: 8.1.1.fill. 1.在array中:void fill (const value_type& val); 2.在algor ...
- Python中使用Mysql(安装篇)
准备工作 import MySQLdb Linux系统自带了Python,但并不是都有这个包,至少我每次拿到一台全新的服务器时候,都发现没有装这个包. 这个东西的下载地址是 http://source ...
- 高性能linux服务器内核调优
高性能linux服务器内核调优 首先,介绍一下两个命令1.dmesg 打印系统信息.有很多同学们服务器出现问题,看了程序日志,发现没啥有用信息,还是毫无解决头绪,这时候,你就需要查看系统内核抛出的异常 ...
- [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
题意:问在一个词典里,那些单词是复合词,即哪些单词是由两个单词拼出来的. 渣渣代码:(Accepted, 30ms) //UVa10391 - Compound Words #include<i ...
- MySQL的SELECT ...for update
最近的项目中,因为涉及到Mysql数据中乐观锁和悲观锁的使用,所以结合项目和网上的知识点对乐观锁和悲观锁的知识进行总结. 悲观锁介绍 悲观锁是对数据被的修改持悲观态度(认为数据在被修改的时候一定会存在 ...
- 学习MVC之租房网站(十)-预约和跟单
在上一篇<学习MVC之租房网站(九)-房源显示和搜索>完成了房源的显示.检索,然后是用户的预约看房,以及后台操作员对预约看房的跟单操作. 预约看房仅有将预约信息保存到对应表的操作,预约表有 ...
- 模板不存在:./xx 错误位置 FILE: LINE:110 (thinkphp上传至服务器后模板无法解析原因)
thinkphp上传至服务器后模板无法解析原因 前几日做好的响应式静态页面上传至虚拟空间,打开网址地址出现: 模板不存在:./App/Admin/View/Config/customerService ...
- JDBC进阶
PreparedStatement的使用: conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?" ...