CakePHP 3:HasOne关系抛出SQLSTATE [23000]:1048列' id'不能为空

时间:2016-11-25 11:03:26

标签: mysql cakephp cakephp-3.0

我遇到了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

enter image description here

一个显着的突破是;当我删除表上的'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;看看父母'对于我认为不应该做的身份......

1 个答案:

答案 0 :(得分:0)

您已将主键定义为char,是否自动递增? 或者您是否将char的id设置为自动增量,并且可以使用cakephp来处理这些表之间的关系吗?如果可以,我会很高兴知道这些事情。但是,如果它不能,那么主键应该是整数:

    Messages
  - id        - integer(11)
  - type      - varchar
  - type_id   - integer(11)

   Texts
  - id        - integer(11)
  - body      - text