setTable在CakePHP 3.x中的旧数据库中无法正常工作

setTable在CakePHP 3.x中的旧数据库中无法正常工作,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我在CakePHP 3.5.13应用程序上有一个遗留数据库(不是按照蛋糕命名约定编写的) 其中一个数据库表名为article\u 95 当我尝试烘焙应用程序时,它将实体名称显示为Article95。然后,它会产生大量错误消息,如: Table 'article95' doesn't exist 因此,我阅读并决定使用setTable()手动执行此操作 因此,我创建了src/Model/Table/Article95Table.php,其中包含以下代码: namespace App\Model

我在CakePHP 3.5.13应用程序上有一个遗留数据库(不是按照蛋糕命名约定编写的)

其中一个数据库表名为
article\u 95

当我尝试烘焙应用程序时,它将实体名称显示为
Article95
。然后,它会产生大量错误消息,如:

 Table 'article95' doesn't exist
因此,我阅读并决定使用
setTable()
手动执行此操作

因此,我创建了
src/Model/Table/Article95Table.php
,其中包含以下代码:

namespace App\Model\Table;

use Cake\ORM\Table;

class Article95Table extends Table
{
    public function initialize(array $config)
    {
        $this->setTable('article_95');
    }
}
但它似乎无法证明这一点。在控制器中,我创建了一种测试方法,并执行了以下操作:

    Cache::clear(false);
    $Article95 = TableRegistry::get('Article95');
    debug($Article95->find()->list());
但它提出了:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'article95' doesn't exist
这就好像它没有读取
setTable()
方法一样

我已经使用了
Cache::clear(false)
来确保它没有被缓存,并且已经检查了
tmp/Cache
目录中的任何可疑文件-其中没有任何相关内容

有什么想法吗

同样,如果我将我的
debug()
语句更改为just
debug($Article95)
我会得到以下表名错误的结果:

object(Cake\ORM\Table) {

    'registryAlias' => 'Article95',
    'table' => 'article95',
    'alias' => 'Article95',
    'entityClass' => '\Cake\ORM\Entity',
    'associations' => [],
    'behaviors' => [],
    'defaultConnection' => 'default',
    'connectionName' => 'default'

}

顺便说一句,如果我在
TableRegistry::get()
中放置了一个不存在的类/实体名称,例如
TableRegistry::get('dsfddsfsd')它不会产生错误消息,但会以不存在的表名显示上面的对象。当然这也是错误的?

我已经设法让它工作了,所以想与大家分享我的解决方案

经过反复试验,似乎把一个S加在类名上(大概是为了让蛋糕考虑复数)。 因此,我将

类重命名为
Article95sTable.php
,然后在其中使用以下代码:

class Article95sTable extends Table
{

    public function initialize(array $config)
    {
        $this->setTable('article_95'); 
    }
}
现在,当我调用以下命令时,它会正确地拾取表格:

$foo = TableRegistry::get('Article95s');
debug($foo);

如果我在
setTable()
方法中重命名表,则输出将相应更改。

此处显示的内容可能不是您实际使用的内容。您拥有的对象是一个所谓的表对象,它是从
\Cake\ORM\table
创建的,因为找不到具体的表类
Article95Table
。对于
dsfdsfdsfsd
也会发生同样的情况。如何才能找不到具体的表类?在相应的目录中有一个文件
Article95Table.php
!它适用于我创建的其他模型,但
bake
似乎很乐意使用它们的命名方案。从这里我真的无法判断,您显示的内容看起来是正确的,但正如我所说的,可能您实际使用的不是这些?可能路径或名称空间中有输入错误,可能是权限问题,可能是使用操作码缓存时的缓存问题,等等……您的表类应称为Articles或OldArticles,而不是95:)。这样注册表就可以找到它并使用它。阅读原始帖子-我正在使用一个遗留数据库,其中表名还没有写入到数据库中。我知道,上面的方法很有效。问题是表类
名称
不必与实际的数据库名称相关。您可以保留遗留的db表,但仍然可以对表类使用命名约定。因此,如果您使用的是
$this->setTable
,则不需要在类名中加上“95”。我知道你写的东西很管用,但是如果你一开始就正确地命名了table类,那么你就省去了麻烦。这就是我要说的。