如何使用 cakePHP 3.x 中用预准备语句定义的临时表



我正在使用cakePHP 3.7

我想从控制器创建一个临时表,然后使用它(具有一些条件和连接)来搜索一些要显示的数据。

表结构目前是静态定义的,即它拥有的字段是固定的,所以我能够定义一个实体或一组字段。 但是,内容因用户输入而异。这意味着我想用准备好的 SQL 语句定义表,我将绑定到用户输入的变量。

我知道如何处理准备好的陈述。

但是我还不明白正确的方法是什么,让 cakePHP 创建我的临时表并为其加载模型。

我在 CakePHP 3:临时 SQL 表的最佳实践中找到了一个有用的答案@ndm 并且,在我所做的尝试中,我为表指定了setTemporary(true)。

然而,我不断收到"表不存在"异常,所以我想我没有正确构建项目类和代码。 正如@ndm所建议的那样,我无法使用查询来创建表

$schema->createSql($connection);

因为 SQL 依赖于用户输入。

其他发现的stackoverflow答案是关于旧版本的cakePHP(2.x),它与3.x不同。

有人可以给我一些更详细的提示,说明从我的 cakePHP 项目中创建和使用使用预准备语句创建的临时表的方法是什么?

这样解决:

  1. 我在数据库中创建了一个与我想要的临时表对应的表
  2. 我已经运行了蛋糕烘焙模型命令,让蛋糕PHP生成实体和表类
  3. 我已经从数据库中删除了表
  4. 在控制器中:

    4.a 我已经准备并执行了创建临时表的语句

    4.b 我已经加载了模型并使用了它

我遇到的问题是(真可惜!)印刷错误,因为在连接查询中的某个时刻,我使用了模型的名称,而不是条件数组中的表名称。

即我错误地要求:

->join([
'table' => 'tempLogs',
'type' => 'INNER',
'conditions' => 'tempLogs.Job = Istanze.Job',
])

而不是正确的:

->join([
'table' => 'temp_logs',
'type' => 'INNER',
'conditions' => 'temp_logs.Job = Istanze.Job',
])

temp_logs 是临时表名,TempLogs 是表类的名称

最新更新