非 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();