setTable не работает должным образом с устаревшей базой данных в CakePHP 3.x - PullRequest
0 голосов
/ 09 мая 2018

У меня есть устаревшая (не записанная в Cake именах) база данных в приложении CakePHP 3.5.13.

Одна из таблиц базы данных называется article_95.

Когда я пытался запечь приложение, оно показывало имя сущности как Article95. Затем он выдает множество сообщений об ошибках:

 Table 'article95' doesn't exist

Итак, я прочитал Ошибка CakePHP: торт Bake использует неверное имя таблицы и Как использовать имя таблицы, отличное от имени в базе данных в торт PHP 3 и решил сделать это вручную, используя 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() на 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('dsfdsfdsfsd');, это не выдаст сообщение об ошибке, но покажет объект выше с несуществующим именем таблицы , Наверняка это тоже неправильно?

1 Ответ

0 голосов
/ 09 мая 2018

Мне удалось заставить это работать, поэтому хотел поделиться своим решением.

После некоторых проб и ошибок кажется, что добавление 's' к имени класса (предположительно, чтобы Cake считал его множественным?) Работает.

Итак, я переименовал класс Table в Article95sTable.php, а затем использовал следующий код внутри:

class Article95sTable extends Table
{

    public function initialize(array $config)
    {
        $this->setTable('article_95'); 
    }
}

Теперь, когда я вызываю следующее, он правильно подбирает таблицу:

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

Чтобы убедиться, что это работает, если я переименую таблицу в моем методе setTable(), выходные данные изменятся соответственно.

...