我遇到了CakePHP的一个奇怪问题,经过2个小时的调试我无法解决。
我得到了以下表格(缩短了):
Messages
- id - char(36)
- type - varchar
- type_id - char(36)
Texts
- id - char(36)
- body - text
消息与文本具有HasOne关系(其中type
应为TEXT
),而文本与消息具有BelongsTo关系。
我的表格如下:
// MessagesTable
public function initialize(array $config)
{
parent::initialize($config);
$this->table('messages');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasOne('Texts', [
'bindingKey' => 'type_id',
'foreignKey' => 'id',
]);
}
// TextsTable
public function initialize(array $config)
{
parent::initialize($config);
$this->table('texts');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Messages', [
'foreignKey' => 'id',
'bindingKey' => 'type_id'
]);
}
当我尝试使用关联文本创建消息时,数据将如下所示:
{
"data": {
"type": "TEXT",
"text": {
"body": "Hey there! This is a manual API request!"
}
}
}
我会收到以下错误:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'id' cannot be null
一个显着的突破是;当我删除表上的'bindingKey' => 'type_id',
时,行将添加到数据库中,而没有链接(type_id
上的messages
列为空)。
我做错了什么?我经常阅读http://book.cakephp.org/3.0/en/orm/associations.html#hasone-associations,我的代码看起来很正确......
非常感谢:)
我现在有一个肮脏的修复...看起来id
中的texts
将不会生成,因为它一直在查看messages
...所以我添加了跟随我的控制器:
$entity->set('type_id', Text::uuid());
此代码为uuid
列生成type_id
。
猜猜是什么......来自id
的{{1}}列已经填满了这个价值!
我的结论是:texts
强迫孩子'#1;看看父母'对于我认为不应该做的身份......
答案 0 :(得分:0)
您已将主键定义为char,是否自动递增? 或者您是否将char的id设置为自动增量,并且可以使用cakephp来处理这些表之间的关系吗?如果可以,我会很高兴知道这些事情。但是,如果它不能,那么主键应该是整数:
Messages
- id - integer(11)
- type - varchar
- type_id - integer(11)
Texts
- id - integer(11)
- body - text