patchEntity似乎删除了外键

时间:2015-08-27 03:07:40

标签: cakephp cakephp-3.0 composite-primary-key

以下是这种情况:

我有一张有复合键的表:

CREATE TABLE records (
  id int(11) NOT NULL,
  pacient_id int(11),
  doctor_id int(11),
  --
  --    bunch of stuff that are null
  --
  PRIMARY KEY (id, pacient_id, doctor_id),
  CONSTRAINT records_ibfk_1 FOREIGN KEY (pacient_id) REFERENCES pacients (id),
  CONSTRAINT records_ibfk_2 FOREIGN KEY (doctor_id) REFERENCES doctors (id)
)

到目前为止一直很好,问题是当我尝试添加记录时...我收到此错误

  

无法插入行,缺少部分主键值。拿到 (,   ,),期待(id,pacient_id,doctor_id)

所以我去了控制器中的add方法,我开始进行两次调试。其中一个是$this->request->data和其他的debuging $record本身(在patchEntity之后)这样的事情:

public function add()
{
    $record = $this->Records->newEntity();

    if ($this->request->is('post')) {
        $record = $this->Records->patchEntity($record, $this->request->data);
        debug($record);
        debug($this->request->data);die;

此代码是通过烘焙生成的。

调试的结果是:

object(App\Model\Entity\Record) {

    'others' => '',
    'staging' => '',
    'surgery' => '',
    'medication' => '',
    'alergy' => '',
    '[new]' => true,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [
        'others' => true,
        'staging' => true,
        'surgery' => true,
        'medication' => true,
        'alergy' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[repository]' => 'Records'

}

[
    'doctor_id' => '2',
    'pacient_id' => '7',
    'points_unusual_lost_weigh' => '',
    'points_lost_weight' => '',
    'lack_apetite' => '',
    'dm' => '',
    'has' => '',
    'dcv' => '',
    'drenal' => '',
    'others' => '',
    'chemotherapy' => '',
    'radiotherapy' => '',
    'metastasis' => '',
    'staging' => '',
    'surgery' => '',
    'alcoholic' => '',
    'smoker' => '',
    'smoker_date' => [
        'year' => '',
        'month' => '',
        'day' => ''
    ],
    'intestine_habit' => '',
    'medication' => '',
    'alergy' => ''
]

看到patchEntity之后没有_id,但是,我真的不知道它为什么没有到达那里。

感谢那些帮助的人!

- 已编辑 -

从rrd回答下面的第一个问题:是的!我做了,它看起来像这样:(这是我的协会)

$this->belongsTo('Pacients', [
    'foreignKey' => 'pacient_id',
    'joinType' => 'INNER'
]);

$this->belongsTo('Doctors', [
    'foreignKey' => 'doctor_id',
    'joinType' => 'INNER'
]);

来自ndm的第二个问题:(这是我的$ _accessible变量)

    protected $_accessible = [
    '*' => true,
    'id' => false,
    'pacient_id' => false,
    'doctor_id' => false,
];

1 个答案:

答案 0 :(得分:3)

正如假设的那样,主键字段设置为不可访问/可分配。

修改实体代码并移除pacient_iddoctor_id,或将其设置为true,或使用accessibleFields调用中的patchEntity选项仅覆盖传递的实体实例的行为。

实体的调试输出在仅显示*时有点误导,因为这表明所有字段都是可访问的。这是因为"空"正在过滤数组条目,以便只显示实际可访问的那些字段,但是当使用*时这显然是个问题,因为异常会丢失,因此似乎还有改进的余地。