CakePHP - Как связать эти модели вместе (что требует использования таблицы отношений)? - PullRequest
0 голосов
/ 25 сентября 2011

Я сейчас использую CakePHP 2.0-RC1.Будучи довольно изящным и все такое, я столкнулся только с одной проблемой, которую я не могу обернуть.Я прочитал документацию по связыванию моделей (http://www.cakedocs.com/models/associations-linking-models-together.html),, но как мне сказать CakePHP выполнить поиск по таблице отношений и найти значения, которые мне нужны? Позвольте мне объяснить.

У меня есть структура базы данныханалогично следующему (было упрощено для вопроса. PK = первичный ключ. FK = внешний ключ)

игра

 - INT(11) id (PK)
 - VARCHAR(100) name
 - VARCHAR(40) year
 - VARCHAR(10) age

категория

 - INT(11) id (PK)
 - VARCHAR(50) name

game_category

 - INT(11) game_id (FK)
 - INT(11) category_id (FK)

Объяснение отношений между ними:

Игра может иметьодна или несколько категорий. Это отношение определено в таблице "game_category". Я хочу, чтобы CakePHP не только находил идентификатор категории в игре, но и имя категории, когда я выполняю $ this-> Game-> find ('first'). Например, я предполагаю, что CakePHP нужно сказать "продолжить через таблицу game_category и перейти к таблице категорий" и найти, как на самом деле называется каждая категория.

У меня есть эти Модели

Game.php

<?php
class Game extends AppModel {
    var $useTable = 'game';

    var $hasMany = array(
    'GameCategory' => array(
        'fields' => '*',
        'className' => 'GameCategory',
        )
    );

    var $hasOne = 'Review';  
}
?>

GameCategory.php

<?php
class GameCategory extends AppModel {
    var $useTable = 'game_category';

    var $belongsTo = 'category';

    var $hasMany = array(
    'Category' => array(
        'fields' => '*',
        'foreignKey' => 'category_id',
        'className' => 'Category',
        'conditions' => array('GameCategory.game_id' => 'Game.id', 'GameCategory.category_id' => 'Category.id'),
    )
    );
}
?>

Category.php

<?php
class Category extends AppModel {
    var $useTable = 'category';   
    var $belongsTo = 'GameCategory';
}
?>

По определенным выше соотношениям я получаю следующие результаты:

Array
(
    [Game] => Array
        (
            [id] => 2
            [name] => Colonization
            [year] => 1995
            [age] => 7
        )

    [GameCategory] => Array
        (
            [0] => Array
                (
                    [game_id] => 2
                    [category_id] => 19
                )

            [1] => Array
                (
                    [game_id] => 2
                    [category_id] => 16
                )

        )
)

Осталось только получить фактическое название каждой категории.Я надеюсь, что кое-что из этого имело смысл.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы должны увидеть hasAndBelongsToMany (HABTM) в книге онлайн и должны изменить имя таблицы game_category на games_categories для правильных соглашений.

Game.php

<?php
class Game extends AppModel {
    var $name = 'Game';
    var $hasAndBelongsToMany = array(
    'Category' =>
        array(
            'className'              => 'Category',
            'joinTable'              => 'game_category',
            'foreignKey'             => 'game_id',
            'associationForeignKey'  => 'category_id',
        )
);

}?>

0 голосов
/ 25 сентября 2011

все имена таблиц должны быть во множественном числе (игры, категории)
неверная ассоциация категории, должна иметьAndBelongsToMany
использовать торт-консоль (./cake bake) для предотвращения будущих ошибок, подобных этой

<?php
class Category extends AppModel {
    var $name = 'Category';
    var $displayField = 'name';
    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $hasAndBelongsToMany = array(
        'Game' => array(
            'className' => 'Game',
            'joinTable' => 'game_categories',
            'foreignKey' => 'category_id',
            'associationForeignKey' => 'game_id',
            'unique' => true,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

} 
<?php
class Game extends AppModel {
    var $name = 'Game';
    var $displayField = 'name';
    //The Associations below have been created with all possible keys, those that are not needed can be removed

    var $hasMany = array(
        'GameCategory' => array(
            'className' => 'GameCategory',
            'foreignKey' => 'game_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );

}

#games
$games = $this->Game->Category->find('all');
...