Cakephp $useTable无法工作

j5fpnvbx  于 2022-11-11  发布在  PHP
关注(0)|答案(4)|浏览(153)

我正在CakePHP 2.2.3上开发一个Web应用程序,已经有了一个数据库(MySQL)。这个数据库是西班牙语的,所以我的应用程序是西班牙语的,我得到错误“错误:在数据源默认值中未找到模型订单的表订单。”
我的模型:
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的值是正确的。

zbsbpyhn

zbsbpyhn1#

我找到了一个不完整的解决方案。检查以下代码:

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'));      
    }
}

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

wooyq4lh

wooyq4lh2#

您找到了问题的答案,其中包含一个对您有效的部分解决方案,但实际上这是一个在任何情况下都不起作用的变通办法。
我想回答这个问题:
“如果我在OrdenesController中设置变量$useTable,我就可以得到Ordenes的数组。谁能告诉我为什么?”
你在自己的解决方案中问到的(还不能评论)。
首先要注意的一点是CakePHP抛出错误:
Error: Table <table name> for model <model name> was not found in datasource default.
1.如果在默认数据源中未找到模型<model name>的表<table name>。(显然)
1.但在某些情况下,如果cakePHP找不到<modelname>模型,这可能会非常令人困惑。
你所做的在你的模型中起作用的原因是因为当你在你的控制器中写:

public $uses = array('orden');

CakePHP假定$this-〉order作为模型,并尝试在Model文件夹中找到模型order(注意CakePHP要查找的文件是order.phpNOTOrder.php它还希望类被称为order和NOTOrder,即使您可以更改模型的类名设置$name)。
如果找到模型,它会尝试从模型的默认设置或设置集(如$useTable$primaryKey)中检索数据。
如果找不到该表,则会显示错误消息,正确指示找不到该表。
但是如果没有找到模型cakePHP会尝试示例化模型,在本例中使用默认值,因为没有进行任何设置这意味着它使用 default 作为数据源,并且是 orden 的英语复数,ordens cakePHP尝试查找 ordens 表(这是cakePHP为模型命名表的标准方式,orden不是一个英语单词)。由于这个表不在 default 中它抛出错误,但真实的的错误是不存在的文件。
当您更改模型中的$useTable值时,您认为它将被使用而不是标准,但cakePHP没有使用您的模型 Orden,而是使用 “动态” 示例化的模型 orden,因为它无法找到错误消息所示的模型 orden(您的类是call Orden 而不是 orden)。
这样,由任何默认模型支持的任何默认操作(例如 find 等)都将工作。
然后你调用$this->orden->find('all'),它将完美地工作,但如果你在你的模型中创建任何函数(你认为你正在使用 Orden 的那个)并调用它,你将得到一个错误,因为它们在 “on fly” 版本中不存在。
因此,您的变通办法可以奏效,但只能部分奏效。

x33g5p2x

x33g5p2x3#

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等工具检查该表是否真的存在。

kzipqqlq

kzipqqlq4#

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

public $uses = array('ScheduleAD');

所以,请检查一下你的模型文件名和模型类名是否和$uses数组中的名字一样,它们必须完全相等:)

相关问题