我正在测试CakePHP 3.0-RC1是否可用于新项目。在安装,配置和创建两个(是,两个)数据库表之后,我对两个表运行'烘焙全部'。
在处理模型中的虚假外键引用之后(外键定义为引用自身的主键?来吧,现在,Bakers!)我遇到了这个错误:
错误:方法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可以使用相同的数据库表定义正常工作。
答案 0 :(得分:0)
删除'contain'
数组中的paginate
部分。您与IsoCountryCodes
烘焙时得到这个结果的原因是烘烤也是基于惯例的。它只能根据已建立的惯例尽力做到最好。其中一个约定是以_id
结尾的任何列都是另一个表的foreignKey。
另一个约定是表的主键应命名为id
。如果不遵守约定,您将需要帮助烘焙计算或修复其生成的代码中的猜测错误。