条件生成


CP中的where可以生成各种复杂SQL片段. 简洁查询语法, 链式查询语法和增删改通用

直接使用字符串

where参数可以直接使用字符串

$this->link->get($table, '*', 'score=1')

此时生成的语句为:

SELECT * FROM user WHERE score=1 LIMIT 1

仅当条件是一个字符串常量的时候(字符串中不带PHP变量), 才能使用字符串传参
仅当条件是一个字符串常量的时候(字符串中不带PHP变量), 才能使用字符串传参
仅当条件是一个字符串常量的时候(字符串中不带PHP变量), 才能使用字符串传参

重要的事情说三遍, 如果where参数的字符串中有PHP变量会有注入风险
重要的事情说三遍, 如果where参数的字符串中有PHP变量会有注入风险
重要的事情说三遍, 如果where参数的字符串中有PHP变量会有注入风险

各种比较操作符

使用 >, <, >=, <=, <>

array(
	'score' => array('>', 1)
);

score大于1的数据, 类似的操作还可以使用>, <>等。

LIKE

like查询

array(
	'name' => array('like', '%john')
);

IN

生成IN查询

array(
	'id' => array('in', array(1,2,3))
);

对应的查询条件SQL片段为 id IN (?,?,?)

OR

生成OR查询条件

array(
	'id' => array('or', array(1, 2, 3))
);

对应的条件片段为: id = ? OR id = ? OR id = ?

BETWEEN

BETWEEN只接受两个值

array(
	'id' => array('between', array(1, 2))
);

生成的查询条件SQL片段为:

BETWEEN 1 AND 2

子条件

生成某一条件的子条件

array(
	'id' => array('or', array(1, 2, 3, array('>', 5) ))
);

此时生成的查询条件SQL片段为

`id = ? OR id = ? OR id = ? OR id > ?`

生成组合查询条件

复杂条件下的组合查询

array(
    'id' => array('in', array(7, 2, 3)),
    'pid' => array('or', array(1, 2 => array('>', 2)))
));

生成的查询条件SQL片段片段为

`id IN (?,?,?) AND pid = ? OR pid > ?`

复杂优先级

更复杂的组合条件可以在数组中的key中使用括号中直接使用SQL片段, 值跟括号中的?对应

array(
    'id' => array('in', array(7, 2, 3)),
    '(pid = ? OR pid = ?)' => array(1, 2)
);

生成的查询条件SQL片段为

`id IN (?,?,?) AND (pid = ? OR pid = ?)`
  • 手动指定条件

where是数组的另一种用法

array("a = ? and (b = ? or b = ?)", array(1, 2, 3));

此时, where是一个包含两个元素的数字索引数组, 数值索引数组的第一个值是SQL片段, 第二个值是对应?的参数.

框架不用解析数组, 是所有写法中效率最高的一种