【问题标题】:CakePHP asking for model table despite useTable = false尽管 useTable = false,CakePHP 仍要求模型表
【发布时间】:2023-08-09 16:51:02
【问题描述】:

我正在创建一个联系表单以向指定地址发送电子邮件。我正在尝试使用 CakePHP 模型验证,因为我不需要联系人模型的表,所以我在联系人模型中将 useTable 设置为 false。 然而,我在执行发送的控制器功能中遇到错误。错误是

缺少数据库表 错误:未找到模型联系人的数据库表联系人。

指向第一次调用 $this->Contact 的行:

$this->Contact->validates($this->data);

我认为这与 CakePHP 框架相得益彰。为什么我错了?

【问题讨论】:

    标签: cakephp


    【解决方案1】:

    编辑:CakePHP 2.x 参见this answer(和comment)(模型文件应称为Contact.php


    CakePHP 1.x - 确认您的模型文件名为 contact.php(小写)。如果不是,CakePHP 将找不到您的模型,而是在运行时创建一个名为 Contact 的“自动模型”,它使用 contacts 表。

    【讨论】:

    • 哇塞。我自己重复了几次,直到现在才意识到我将其命名为contact.ctp,因为这是出于习惯。我觉得自己像个傻瓜。
    • 呵呵,我们都去过。 actsAsactAs 曾经让我非常满意的一个,浪费了几个小时。
    【解决方案2】:

    这是搜索的最佳结果,但我认为该信息已过时。

    在 CakePHP 2.0+ 中,您需要在模型中设置 $useTable = false;,模型名称使用正确的大小写(因此它应该是 Contact 而不是建议的 contact)并且控制器必须具有 $uses = 'Contact'; 或 @987654325 @ 或 cake 生成默认模型属性并尝试加载不存在的表。所以这两个东西都必须设置它才能工作。

    【讨论】:

    • 就像在@deizel 答案中一样,验证您的模型文件名为 Contact.php(CakePHP 2.x 中的大写字母)。如果不是,CakePHP 将无法使用 $useTable 找到您的模型和任何唯一的表定义。
    【解决方案3】:

    有两件事对我产生了影响——将模型的文件名更改为 Contact.php(而不是 ContactModel.php)并在我的 ContactController.php 中注释掉 var $uses = 'Contact';

    此外,许多联系表单的教程都是针对早期版本的 CakePHP。请务必使用正确的表单输入结构。这是我在 Cake 2.1 中的视图:

    <?php 
        echo $this->Form->create('Contact');
        echo $this->Form->inputs();
        echo $this->Form->end('Send');
    
    ?>
    

    【讨论】:

    • 这里也是一个 2.x 版本:dereuromark.de/2011/12/15/tools-plugin-part-2-contact-form - 使用模式
    • 非常感谢有关将 SomethingModel.php 重命名为 Something.php 的提示。我遇到了完全相同的问题,正要发疯寻找问题的根源:-)
    • 我遇到了同样的问题,但在阅读此解决方案之前我只是不小心修复了它。
    【解决方案4】:

    如果没记错的话,您实际上并没有设置模型:

    $this->Contact->set( $this->data );
    $this->Contact->validates();
    

    在您的代码中,当您尝试验证模型时,它实际上并未填充。

    【讨论】:

      【解决方案5】:

      如果您使用没有表的模型,您还需要设置架构,例如

      class Contact extends AppModel {
          var $name = 'Contact';
          var $useTable = false;
          var $_schema = array(
              'name' => array('type' => 'string', 'length' => 255),
              'email' => array('type' => 'string', 'length' => 255),
              'message' => array('type' => 'text')
          );
      }
      

      【讨论】:

        【解决方案6】:

        如果它对任何人有帮助,我发现如果我有

        var $uses = 'ModelName';
        

        在我的控制器中,它将覆盖 useTable。如果您不需要它,请将其删除。

        【讨论】:

          最近更新 更多