简体中文
版本: v2.3.0

raw

Medoo 提供适用于复杂、高度可定制查询的原生 SQL 表达式,并支持占位符和标识符引用的快捷语法。

Medoo::raw($query, $map)

语法

raw() 支持直接编写原生 SQL 表达式,并简化标识符引用。使用 <name> 标记列名(或带表名前缀的列名)后,Medoo 会自动完成相应的引用处理。
Medoo::raw("AVG(<weight>)")

用于查询列

您可以在 select()get() 的列参数中使用 raw() 对象。数组键会成为结果中的别名。
$data = $database->get('account', [
	'user_name',
	'score' => Medoo::raw('SUM(<age> + <experience>)')
], [
	'user_id' => 100
]);
SELECT "user_name", SUM("age" + "experience") AS "score"
FROM "WP_account"
WHERE "user_id" = 100

用于 UPDATE 和 INSERT 语句

raw() 对象也可以作为 insert()update() 中的列值使用。
$data = $database->insert('account', [
	'user_name' => 'apple',
	'user_id' => Medoo::raw('UUID()')
]);

$data = $database->update('account', [
	'user_name' => 'apple',
	'user_id' => Medoo::raw('UUID()')
], [
	'age[>]' => 10
]);

用于 WHERE 子句

raw() 对象也可以在 where 数组中使用,以编写更复杂的条件表达式。
$data = $database->select('account', [
	'user_name',
	'user_id',
], [
	'datetime[>=]' => Medoo::raw('DATE_SUB(NOW(), INTERVAL 1 DAY)'),
	'ORDER' => Medoo::raw('RAND()'),
	'LIMIT' => 10
]);
SELECT "user_name", "user_id"
FROM "account"
WHERE "datetime" >= DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY RAND()
LIMIT 10

配合预处理语句

如果原生表达式中包含变量值或用户输入,请使用预处理占位符来防止 SQL 注入。
$today = "2017-05-01";

$database->select('account', [
	'user_id',
	'user_name'
], [
	'datetime' => Medoo::raw('DATE_ADD(:today, INTERVAL 10 DAY)', [
		':today' => $today
	])
]);

作为 WHERE 子句

您还可以把 raw() 对象作为完整的 WHERE 子句,用于更高级的筛选逻辑。
$data = $database->select('account', [
		'user_id',
		'email'
	],
	Medoo::raw('WHERE
		LENGTH(<user_name>) > 5
		ORDER BY RAND()
		LIMIT 10
	')
);
SELECT "user_id", "email"
FROM "account"
WHERE LENGTH("user_name") > 5
ORDER BY RAND()
LIMIT 10