构造查询条件

CP中的where可以生成各种复杂SQL片段

使用字符串

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

ActLog::dbs()->get('id=31')

此时生成的语句为:

SELECT * FROM cpa_act_log WHERE id=31

仅当条件是一个字符串常量的时候(字符串中不带PHP变量), 否则有SQL注入风险

各种比较操作符

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

[
    'score' => ['>', 1]
];

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

LIKE

like查询

[
    'name' => ['like', '%john']
];

IN

生成IN查询

[
    'id' => ['in', [1, 2, 3]]
];

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

OR

生成OR查询条件

[
    'id' => ['or', [1, 2, 3]]
];

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

BETWEEN

BETWEEN只接受两个值

[
    'id' => ['between', [1, 2]]
];

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

BETWEEN 1 AND 2

子条件

生成某一条件的子条件

[
    'id' => ['or', [1, 2, 3, ['>', 5]]]
];

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

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

生成组合查询条件

复杂条件下的组合查询

[
    'id' => ['in', [7, 2, 3]],
    'pid' => ['or', [1, 2 => ['>', 2]]]]
];

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

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

复杂优先级

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

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

生成的查询条件SQL片段为

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

SQL标签

#SQL# id 按标签中的值原样构建

[
    'id' => ['#SQL#', 'id = type']
]

生成的查询语句如下

id = type 

不想把值作为参数传入时, 应该使用 #SQL# 标签

RAW标签

#RAW# 忽略field, 原样构建

$Act::dbs()->getAll([
    'id1' => ['#RAW#', 'id = 1']
]);

生成的查询条件如下:

WHERE (id = 1)  

在条件中拼接sql片段时使用 #RAW# 标签

原生SQL条件

where是数组的另一种用法

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

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