2

我正在CakePHP 2.2.3 上开发一个已经存在数据库(MySQL)的网络应用程序。这个数据库是西班牙语,所以我的应用程序是西班牙语,我收到错误“错误:在数据源默认值中找不到模型 orden 的表 orden”。

我的模型:

Orden.php

class Orden extends AppModel{
    public $name = 'Orden';
    public $useTable = 'ordenes';
    public $primaryKey = 'idorden';

}

桌子:

CREATE TABLE IF NOT EXISTS `ordenes` (
  `idOrden` bigint(20) NOT NULL AUTO_INCREMENT,
  -- more columns --
  PRIMARY KEY (`idOrden`)
)

APP/config/database.php

class DATABASE_CONFIG {

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'USER',
    'password' => 'PASS',
    'database' => 'DATABASE',
    'prefix' => '',
    //'encoding' => 'utf8',
);

}

根据文档,我可以用相应的表声明 $useTable 但这不起作用。任何人都可以帮助我吗?

编辑:同样的问题,$primaryKey但变量$name具有正确的值。

4

4 回答 4

1

我找到了一个半而丑陋的解决方案。检查以下代码:

class OrdenesController extends AppController{

    public $name = 'Orden'; 
    public $uses = array('orden'); 
    public $helpers = array('Html', 'Form');

    public function index(){
        $this->orden->useTable = 'ordenes';
        $this->set('ord', $this->orden->find('all'));      
    }
}

$useTable如果我在 中设置变量OrdenesController,我可以得到 Ordenes 的数组。谁能告诉我为什么?

于 2012-10-25T00:23:41.567 回答
1

您找到了问题的答案,并提供了对您有效的部分解决方案,但实际上这是一种在任何情况下都不起作用的解决方法。

我想回答这个问题:

“如果我$useTable在 OrdenesController 中设置变量,我可以获得 Ordenes 数组。谁能告诉我为什么?”

您在自己的解决方案中提出的问题(还不能评论).

第一个重要的注意事项 CakePHP 会抛出错误:

Error: Table <table name> for model <model name> was not found in datasource default.

  1. 如果在数据源默认值中找不到<table name>模型表。(显然)<model name>
  2. 但在某些情况下,如果 cakePHP 找不到模型<modelname>,这可能会很混乱。

您在模型中所做的工作的原因是因为在您的控制器中您编写:

public $uses = array('orden');

CakePHP 假定 $this->order 作为模型并尝试在文件夹 Model 中查找模型顺序(请注意,CakePHP 将要查找的文件是order.php 而不是Order.php它也期望该类被称为order而不是Order,即使您可以更改模型的类名设置$name)。

如果它找到模型,它会尝试从模型的默认设置或设置集(如您的情况中的$useTableand $primaryKey)中检索数据。
如果它找不到表,则会显示错误消息,正确指示它找不到表的事实。

但是如果它没有找到模型 cakePHP 尝试实例化模型,在这种情况下使用默认值,因为没有进行任何设置(模型是“on fly”实例化的)。这意味着它使用default作为数据源,并且是 orden 的英文复数,ordens cakePHP尝试查找ordens表(这是 cakePHP 为模型命名表的标准方式,而 orden 不是英文单词)。由于此表不在默认数据源中,因此会引发错误,但真正的错误是不存在的文件。

当您更改$useTable模型中的值时,您认为它将被使用而不是标准,但是 cakePHP 没有使用您的模型Orden,而是“动态”实例化模型orden,因为它无法找到模型orden,因为错误消息是 sais(您的类是调用Orden而不是orden)。

因此,任何默认模型支持的任何默认操作(例如find等)都将起作用。
然后你调用$this->orden->find('all')它会完美地工作,但是如果你在你的模型中创建任何函数(你认为你正在使用Orden的那个)并调用它,你会得到一个错误,因为它们在“on fly”版本中不存在。

出于这个原因,您的解决方法将起作用,但只是部分起作用。

于 2015-11-16T09:24:48.453 回答
0

您确定您的表存在于您的默认数据源中吗?CakePHP 可以使用多个数据源来处理多个连接(请参阅 参考资料APP/config/database.php

不正确,但与您的问题无关,是public $primaryKey = 'idorden';. 查看您的 MySQL 代码,它应该说:public $primaryKey = 'idOrden';

你有调试模式吗?尝试将缓存刷新到/APP/tmp/cache.

也许您使用的表前缀和数据库中的表没有前缀?

您是否复制并粘贴了错误消息?模型不太可能用小型大写字母编写。

$useTable您还可以使用无关来定义您的单词的自定义单数和复数形式。见http://book.cakephp.org/2.0/en/development/configuration.html#inflection-configuration

但是请查看您的数据库配置或向我们展示代码以让我们查看您是否使用多个数据源。否则,在 mysql 提示符或 phpMyAdmin 等工具的帮助下检查该表是否确实存在。

于 2012-10-24T20:08:29.303 回答
-1

我也遇到了这个问题。原因是我的模型 php 文件名ScheduleAd.php,但我写"ScheduleAD"的是使用数组。

public $uses = array('ScheduleAD');

所以,请检查您的模型文件名和模型类名和 $uses 数组中的名称,它们必须完全相等:)

于 2014-05-15T16:03:21.750 回答