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

时间:2019-08-26 16:20:37

标签: cakephp cakephp-3.7

我正在使用CakePHP 3.7

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

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

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

但是我还不完全清楚继续前进的正确方法是让cakePHP创建我的临时表并为其加载模型。

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

但是我一直收到“表不存在”异常,所以我想我没有正确构造项目类和代码。 我无法按照@ndm的建议通过使用

创建的查询来创建表
  

$ schema-> createSql($ connection);

因为sql取决于用户输入。

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

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

1 个答案:

答案 0 :(得分:0)

已解决:

  1. 我已经在数据库中创建了一个与所需临时表相对应的表
  2. 我已经运行了cake bake模型命令,以使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是表类的名称