以下是这种情况:
我有一张有复合键的表:
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,
];
答案 0 :(得分:3)
正如假设的那样,主键字段设置为不可访问/可分配。
修改实体代码并移除pacient_id
和doctor_id
,或将其设置为true
,或使用accessibleFields
调用中的patchEntity
选项仅覆盖传递的实体实例的行为。
见
实体的调试输出在仅显示*
时有点误导,因为这表明所有字段都是可访问的。这是因为"空"正在过滤数组条目,以便只显示实际可访问的那些字段,但是当使用*
时这显然是个问题,因为异常会丢失,因此似乎还有改进的余地。