非 select 查询的自定义函数 Cake Query Builder
Custom functions for non-select queries Cake Query Builder
我想在 Cakephp 查询生成器的插入查询中使用 mariadb INET_ATON()
。
INSERT INTO failed_logins
SET email = 'example@test.com', ip_address = INET_ATON('192.168.0.1'), sent_email = 1;
然后我想在 select 查询中使用 INET_NTOA()
检索数据。
SELECT id, email, INET_NTOA(ip_address) AS ip_address, sent_email FROM failed_logins;
如何在 Cake Query Builder 上将这些函数与插入和 select 一起使用?
我看到 Using SQL functions 但无法解决我的问题。
经过大量尝试后,我终于成功了。
$this->connection->newQuery()->into('failed_logins');
$newIp = $query->func()->inet_aton([$ip]);
$query->insert(['email', 'ip_address', 'sent_email'])->values(
['email' => $email, 'ip_address' => $newIp, 'sent_email' => $sentEmail]
)->execute()->lastInsertId();
非常复杂,我的 IDE 和 PHPStan 向我显示函数“inet_aton”未定义的警告。
如果在 values()
数组中我可以像 ['ip_address' => "INET_ATON($ip)"]
那样完成它,我会很喜欢它。编辑:这不是一个好主意,请参阅评论。但是可以使用 ->bind()
(下面的代码片段)来完成类似的安全操作。
编辑:从代码片段中删除了'literal'
(感谢@ndm)
IDE 和分析工具 - 友好的解决方案
$this->connection->newQuery()->into('failed_logins');
$query->insert(
[
'email',
'ip_address',
'sent_email',
]
)->values(
[
'email' => $email,
'ip_address' => $query->newExpr("INET_ATON(:ip)"),
'sent_email' => $sentEmail,
]
)->bind(':ip', $ip, 'string')->execute()->lastInsertId();
我想在 Cakephp 查询生成器的插入查询中使用 mariadb INET_ATON()
。
INSERT INTO failed_logins
SET email = 'example@test.com', ip_address = INET_ATON('192.168.0.1'), sent_email = 1;
然后我想在 select 查询中使用 INET_NTOA()
检索数据。
SELECT id, email, INET_NTOA(ip_address) AS ip_address, sent_email FROM failed_logins;
如何在 Cake Query Builder 上将这些函数与插入和 select 一起使用?
我看到 Using SQL functions 但无法解决我的问题。
经过大量尝试后,我终于成功了。
$this->connection->newQuery()->into('failed_logins');
$newIp = $query->func()->inet_aton([$ip]);
$query->insert(['email', 'ip_address', 'sent_email'])->values(
['email' => $email, 'ip_address' => $newIp, 'sent_email' => $sentEmail]
)->execute()->lastInsertId();
非常复杂,我的 IDE 和 PHPStan 向我显示函数“inet_aton”未定义的警告。
如果在 values()
数组中我可以像 ['ip_address' => "INET_ATON($ip)"]
那样完成它,我会很喜欢它。编辑:这不是一个好主意,请参阅评论。但是可以使用 ->bind()
(下面的代码片段)来完成类似的安全操作。
编辑:从代码片段中删除了'literal'
(感谢@ndm)
IDE 和分析工具 - 友好的解决方案
$this->connection->newQuery()->into('failed_logins');
$query->insert(
[
'email',
'ip_address',
'sent_email',
]
)->values(
[
'email' => $email,
'ip_address' => $query->newExpr("INET_ATON(:ip)"),
'sent_email' => $sentEmail,
]
)->bind(':ip', $ip, 'string')->execute()->lastInsertId();