【问题标题】:How to work with temporary tables defined with prepared statements in cakePHP 3.x如何使用 cakePHP 3.x 中使用准备好的语句定义的临时表
【发布时间】:2019-12-30 20:38:53
【问题描述】:

我正在使用 cakePHP 3.7

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

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

我知道如何处理准备好的语句。

但我还没有完全理解正确的方法是什么,让 cakePHP 创建我的临时表并为其加载模型。

我在@ndm CakePHP 3: Best Practice for Temporary SQL Tables 找到了一个有用的答案 而且,在我所做的尝试中,我为表指定了 setTemporary(true)。

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

$schema->createSql($connection);

因为 sql 依赖于用户输入。

其他找到的 stackoverflow 答案是关于与 3.x 不同的旧版本 cakePHP (2.x)

谁能给我一些更详细的提示,告诉我在我的 cakePHP 项目中创建和使用使用准备好的语句创建的临时表的方法是什么?

【问题讨论】:

  • 我都尝试在表类本身中创建临时表,并在加载模型之前从控制器方法创建它

标签: cakephp cakephp-3.7


【解决方案1】:

这样解决:

  1. 我已经在数据库中创建了一个与我想要的临时表相对应的表
  2. 我已经运行 cake bake model 命令让 cakePHP 生成实体和表类
  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为表类名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多