CakePHP добавляет ассоциацию модели в таблицу базы данных - PullRequest
1 голос
/ 30 марта 2011

Я новичок в CakePHP, и английский не мой родной язык, поэтому я прошу прощения, если мой вопрос не ясен. Во всяком случае, у меня есть две модели: Разработчик и Игра .

<?php
class Developer extends AppModel
{
    var $name = 'Developer';
    var $belongsTo = array('Game');
}
?>

и

<?php
class Game extends AppModel
{
    var $name = 'Game';
    var $hasMany = array('Developer');
}
?>

Как я могу добавить новую строку в таблицу developer_games, в которой есть только поля game_id и developer_id, указывающие на наличие связи между игрой и разработчиком, фактически не зная идентификаторов игры и разработчика, поскольку они создан в то же время. Я думал, что CakePHP сможет сделать это для меня, но он не добавит новую строку в таблицу developer_games. Придется ли мне извлекать поля id из Game and Developer после сохранения данных, а затем вручную сохранять данные модели отношений в таблице developer_games?

Вот код, который я использую для добавления новой игры и разработчика в базу данных:

$data = $this->Game->saveAll(array(
    'Game' => array(
        'game_id' => $data['GameId'],
        'game_name' => $data['GameName'],
    ),
    'Developer' => array(
        'Developer' => array(
            'username' => $_POST['dev_username'],
            'password_hash' => $_POST['dev_password'],
        ),
    ),
));
$this->Game->saveAll($data);

Если мне что-то непонятно, дайте мне знать, и я уточню. Я долго боролся с этой проблемой, поэтому буду признателен за любую помощь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Пожалуйста, прочтите это: http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM "hasAndBelongsToMany" - это отношения, которые вы хотите.Cake заботится об ассоциациях, и вам не нужна модель для таблицы соединений.

0 голосов
/ 30 марта 2011

Если я не правильно понял отношения Game-Developer в логических схемах «многие ко многим», то это должно быть [Game] -1: N- [Assignment] -N: 1- [Developer] Назначение здесь ваше »developer_games ", я предлагаю вам переименовать таблицу для удобства

В соответствии с вашим сценарием рекомендуемая реализация в CakePHP будет 3 классами модели.

<?php
class Developer extends AppModel
{
    var $name = 'Developer';
    var $hasMany = array('Assignment');
}
?>

<?php
class Game extends AppModel
{
    var $name = 'Game';
    var $hasMany = array('Assignment');
}
?>

<?php
class Assignment extends AppModel
{
    var $name = 'Assignment';
    var $belongsTo = array('Game','Developer');
}
?>

Вот код для добавления нового Назначения

//retrieved submitted data --> $data
$data = $this->data;

// this is for the case you want to insert into 3 tables at a same time
$newGame = $this->Game->create();
$newGame = array(
    'Game'=> array(
        'name' => $data['Game']['name']
    )
);
$this->Game->save($newGame);
$newGameId = $this->Game->getLastInsertId();

$newDev = $this->Developer->create();
$newDev = array(
    'Developer'=> array(
        'name' => $data['Developer']['name']
    )
);
$this->Developer->save($newDev);
$newDevId = $this->Developer->getLastInsertId();

/**
* or if you already have Game Id, and Developer Id, then just load it on, and 
* put it in the statement below, to create a new Assignment
**/
$newAssignment = $this->Assignment->create();
$newAssignment = array(
    'Assignment' => array(
        'game_id' => $newGameId,
        'developer_id' => $newDevId,
    )
);
$this->Assignment->save($newAssignment);
...