CakePHP 3.0-RC1从Baked控制器中的索引方法抛出致命错误

时间:2015-01-21 21:01:49

标签: cakephp-3.0

我正在测试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可以使用相同的数据库表定义正常工作。

1 个答案:

答案 0 :(得分:0)

删除'contain'数组中的paginate部分。您与IsoCountryCodes

没有任何关联

烘焙时得到这个结果的原因是烘烤也是基于惯例的。它只能根据已建立的惯例尽力做到最好。其中一个约定是以_id结尾的任何列都是另一个表的foreignKey。

另一个约定是表的主键应命名为id。如果不遵守约定,您将需要帮助烘焙计算或修复其生成的代码中的猜测错误。