保存hasOne关联的ID

时间:2018-04-06 16:53:16

标签: cakephp orm associations cakephp-3.x

我有一个看起来像这样的表:

,====,==============,============,==========,
| 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_tocontact_from id#s ?

1 个答案:

答案 0 :(得分:1)

您选择的名字会导致编组人员发生冲突。

您不能对绑定/外键和属性名称使用相同的名称,这两者需要不同,因为前者用于保存标识符,后者用于保存实体或者可以编组到实体中的数组 - 这两个都不适用于您传递的值,因此它将被丢弃。

理想情况下,您应该遵循CakePHP命名约定,并将_id添加到您的列中,即将它们命名为contact_from_idcontact_to_id

另见