CakePHP 3.0-RC1 выдает фатальную ошибку из метода index в контроллере Baked

Я тестирую CakePHP 3.0-RC1 для возможного использования в новом проекте. После установки, настройки и создания двух (да, двух) таблиц базы данных я запустил «выпечку всех» для обеих таблиц.

После работы с ложными ссылками внешнего ключа в модели (внешний ключ, определенный как первичный ключ, ссылающийся на себя? Да ладно, Бейкеры!) Я сталкиваюсь с этой ошибкой:

Ошибка: Метод Cake\ORM\Query::__toString() не должен вызывать исключение Файл /srv/www/htdocs/wmcb/cake/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php Строка: 193

Не мой код. ;)

Определение оскорбительной таблицы:

-- -----------------------------------------------------
-- Table `ISOCountryCodes`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `iso_country_codes` (
`iso_country_code_id` VARCHAR(4) CHARACTER SET utf8 NOT NULL ,
`iso_country_name` VARCHAR(64) CHARACTER SET utf8 NOT NULL ,
`iso_country_name_french` VARCHAR(64) CHARACTER SET utf8 NOT NULL ,
PRIMARY KEY (`iso_country_code_id`) 
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8
COMMENT = 'Look-up table of ISO 3166-1 Country Names and Codes'
;

Метод индекса IsoCountryCodesController, сгенерированный выпечкой:

/**
* Index method
*
* @return void
*/
public function index()
{
    $this->paginate = [
        'contain' => ['IsoCountryCodes']
    ];
    $this->set('isoCountryCodes',    $this->paginate($this->IsoCountryCodes));
    $this->set('_serialize', ['isoCountryCodes']);
}

И метод инициализации из IsoCountryCodesTable.php:

/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
    $this->table('iso_country_codes');
    $this->displayField('iso_country_code_id');
    $this->primaryKey('iso_country_code_id');
//   $this->belongsTo('IsoCountryCodes', ['foreignKey' => iso_country_code_id']);
}

с закомментированным рефлексивным внешним ключом.

Это поведение справедливо для обеих таблиц.

CakePHP 2.5 корректно работает с теми же определениями таблиц базы данных.


person Tim    schedule 21.01.2015    source источник
comment
Строка 193? Этого даже не существует. В любом случае, вы работаете против соглашений, так что вам не следует слишком удивляться тому, что вам придется иметь дело с проблемами. Проблемное имя первичного ключа (вы можете сообщить об этом как об ошибке на GitHub или, может быть, даже исправить это самостоятельно в PR), а также предполагаемую ассоциацию и сдерживание (вам следует удалить это) в стороне, это работает нормально для меня, нет такая ошибка. Кроме того, запекание не генерирует для меня вызов set() с _serialize, но я использую недавний снимок разработчика, возможно, вам тоже стоит попробовать.   -  person ndm    schedule 22.01.2015


Ответы (1)


Удалите часть 'contain' в массиве paginate. Вы не связаны с IsoCountryCodes

Причина, по которой вы получили такой результат при выпечке, заключается в том, что выпечка также основана на соглашениях. Он может только стараться делать все возможное, основываясь на установленных соглашениях. Одним из таких соглашений является то, что любой столбец, оканчивающийся на _id, является внешним ключом для другой таблицы.

Другое соглашение заключается в том, что первичные ключи таблиц должны называться id. Если вы не следуете соглашениям, вам нужно будет помочь выяснить или исправить ошибки угадывания в сгенерированном коде.

person José Lorenzo Rodríguez    schedule 22.01.2015
comment
На самом деле, корень зла был, как указывает @Jose, ключевой столбец не был назван в соответствии с соглашением. Это часть кривой обучения, я полагаю, скорее, разучивание; как разработчик базы данных с 25-летним опытом, я склонен работать с третьей нормальной формой, и всегда называть идентификатор столбца первичного ключа ... неприятно. Но, спасибо, Хосе. - person Tim; 22.01.2015