CP中的where可以生成各种复杂SQL片段
where参数可以直接使用字符串
ActLog::dbs()->get('id=31')
此时生成的语句为:
SELECT * FROM cpa_act_log WHERE id=31
仅当条件是一个字符串常量的时候(字符串中不带PHP变量), 否则有SQL注入风险
使用 >, <, >=, <=, <>
[
'score' => ['>', 1]
];
score大于1的数据, 类似的操作还可以使用>
, <>
等。
like查询
[
'name' => ['like', '%john']
];
生成IN
查询
[
'id' => ['in', [1, 2, 3]]
];
对应的查询条件SQL片段为 id IN (?,?,?)
生成OR
查询条件
[
'id' => ['or', [1, 2, 3]]
];
对应的条件片段为: id = ? OR id = ? OR id = ?
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#
id
按标签中的值原样构建
[
'id' => ['#SQL#', 'id = type']
]
生成的查询语句如下
id = type
不想把值作为参数传入时, 应该使用
#SQL#
标签
#RAW#
忽略field
, 原样构建
$Act::dbs()->getAll([
'id1' => ['#RAW#', 'id = 1']
]);
生成的查询条件如下:
WHERE (id = 1)
在条件中拼接
sql
片段时使用#RAW#
标签
where是数组的另一种用法
["a = ? and (b = ? or b = ?)", [1, 2, 3]];
此时, where是一个包含两个元素的数字索引数组, 数值索引数组的第一个值是SQL片段, 第二个值是对应?
的参数.