我有一个看起来像这样的表:
,====,==============,============,==========,
| id | contact_from | contact_to | message |
|====|==============|============|==========|
| 1 | 1 | 2 | some msg |
| 2 | 2 | 1 | reply |
'----'--------------'------------'----------'
我创建了一个新行,执行此操作:
public function add()
{
$message = $this->Messages->newEntity();
if ($this->request->is('post') && $this->request->is('ajax')) {
$data = $this->request->getData();
$data['contact_to'] = (int)$data['contact_to'];
$data['contact_from'] = (int)$this->Auth->user('id');
$message = $this->Messages->patchEntity($message, $data);
if ($this->Messages->save($message)) {
echo json_encode(['status' => 'success']);
exit;
}
echo json_encode(['status' => 'error']);
exit;
}
}
这是我的hasOne协会:
$this->hasOne('ContactFrom', [
'className' => 'Contacts',
'foreignKey' => 'id',
'bindingKey' => 'contact_from',
'joinType' => 'INNER',
'propertyName' => 'contact_from'
]);
$this->hasOne('ContactTo', [
'className' => 'Contacts',
'foreignKey' => 'id',
'bindingKey' => 'contact_to',
'joinType' => 'INNER',
'propertyName' => 'contact_to'
]);
正如您所看到的,我将ID传递给新行,但除了ID之外,它还保存了所有内容。在debug($message)
电话结束后我patchEntity
,它会像这样回来:
object(App\Model\Entity\Message) {
'message' => 'asdfasdf',
'date_sent' => object(Carbon\Carbon) {},
'[new]' => true,
'[accessible]' => [
'contact_to' => true,
'contact_from' => true,
'message' => true,
],
'[dirty]' => [
'message' => true,
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Messages'
}
它丢弃了我的ID。我假设它是因为我需要将实体传递给它,但为了节省数据库调用,如何将它保存到表中contact_to
和contact_from
id#s ?
答案 0 :(得分:1)
您选择的名字会导致编组人员发生冲突。
您不能对绑定/外键和属性名称使用相同的名称,这两者需要不同,因为前者用于保存标识符,后者用于保存实体或者可以编组到实体中的数组 - 这两个都不适用于您传递的值,因此它将被丢弃。
理想情况下,您应该遵循CakePHP命名约定,并将_id
添加到您的列中,即将它们命名为contact_from_id
和contact_to_id
。
另见