CakePHP 3, как правильно сохранить связанную ассоциацию 1: N, используя REST? - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы спросить, как сохранить связанные данные, используя REST в CakePHP3?

Чтобы предположить, что у меня есть следующая ассоциативная команда, может иметь много связанных тегов (см. Диаграмму EER ниже, пожалуйста).

enter image description here

Структура запроса JSON следующая:

{
    "command": "whoami",
    "description": "SOMETHING",
    "public": false,
    "tags": [
        {"name":"TEST1"},
        {"name":"TEST2"}
    ]
}

Я пытался реализовать сохранение в ассоциациях, используя

https://book.cakephp.org/3.0/en/orm/saving-data.html#saving-with-associations

Но без удачи.

Итак, я сделал это следующим образом:

public function add()
    {
        $this->request->allowMethod(['post']);
        $data = $this->request->getData();
        $user = $this->CommonHelper->getUserByToken($this->token);
        $command = $this->Commands->newEntity($data);
        $tags = $data['tags'];
        $command->user = $user;
        $command = $this->Commands->patchEntity($command, $data);
        if ($this->Commands->save($command)) {
            if($tags != null)
                $this->addTags($tags, $command);//TODO: DO IT IN THE RIGHT WAY WITH MARSHALLING
            $this->apiResponse['data'] = $command;
            $this->httpStatusCode = 200;
        } else {
            $this->httpStatusCode = 400;
        }
    }

    private function addTags($tags, $command)
    {
        foreach ($tags as $value) {
            $tag = $this->Tags->newEntity($value);
            $tag->commands_id = $command->id;
            $this->Tags->save($tag);
        }
    }

Но это единственное специальное решение, я хотел бы сделать этоправильно использовать возможности архитектуры CakePHP ORM.

Определение таблицы тегов следующее:

public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('tags');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->belongsTo('Commands', [
            'foreignKey' => 'commands_id',
            'joinType' => 'INNER'
        ]);
    }

Спасибо за любой совет.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Таким способом вы можете сохранить связанные данные.Ваш массив данных должен быть как в этом формате.

$data = array(
    "command"=> "whoami",
    "description"=> "SOMETHING",
    "public"> false,
    "tags": [
        array("name" => "TEST1"),
        array("name"=> "TEST2")
    ]
)

$patchedEntity= $this->Commands->patchEntity($saveData,$data,['associated' => ['Tags']]); 
$result = $this->Commands->save($patchedEntity);

Определение отношений в таблице команд должно быть следующим.

public function initialize(array $config)
    {
        parent::initialize($config); 
        $this->setTable('commands');  
        $this->hasMany('Tags', [
            'foreignKey' => 'command_id'
        ]);
    }

Соотношение в таблице тегов должно быть таким.

public function initialize(array $config)
    {
        parent::initialize($config); 
        $this->setTable('tags');  
        $this->belongsTo('Commands', [
            'foreignKey' => 'command_id'
        ]);
    }
0 голосов
/ 21 февраля 2019

Это было дано плохими соглашениями об именах в модели.Использование единственного числа во внешнем ключе помогло мне решить проблему.

...