Сохранение идентификатора ассоциации hasOne

У меня есть таблица, которая выглядит так:

,====,==============,============,==========,
| 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'
]);

Как видите, я передаю идентификатор в новую строку, однако он сохраняет все, кроме идентификаторов. Когда я 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'
}

Он сбрасывает мои удостоверения личности. Я предполагаю, что это потому, что мне нужно передать ему Entity, но чтобы сэкономить на вызовах БД, как я могу заставить его сохранять идентификаторы contact_to и contact_from в таблицу?


person Bird87 ZA    schedule 06.04.2018    source источник


Ответы (1)


Имена, которые вы выбрали, вызывают конфликт в marshaller.

Вы не можете использовать одно и то же имя для привязки/внешнего ключа и имени свойства, эти два должны быть разными, так как первое предназначено для хранения идентификатора, а второе предназначено для хранения объекта или массива, который может быть объединены в сущность - ни то, ни другое не относится к значению, которое вы передаете, поэтому оно будет отброшено.

В идеале вы должны следовать соглашениям об именах CakePHP и добавлять _id к вашим столбцам, т.е. называть их contact_from_id и contact_to_id.

Смотрите также

person ndm    schedule 09.04.2018