HABTM внутреннее соединение CakePHP 2.0

У меня 5 таблиц: tournaments, rounds, videos, rounds_tournaments, rounds_videos

Связи:

Турнир имеет много видео
Видео принадлежит Турниру

Турнир HABTM Тур
Тур HABTM Турнир

Видео HABTM Тур
Раунд HABTM Видео

Чего я хочу добиться:

Теперь я хочу только видео, которые относятся к определенному Турниру и Раунду.

Поэтому, нажимая на Турнир, я хочу только раунды, связанные с выбранным Турниром. И когда я нажимаю на Раунд, я хочу получить только видео, связанные с нажатием на Раунд и Турнир.

Я попробовал все, но не могу заставить его работать. Я также играл с несколькими представлениями (индекс, просмотр действий Раунда / Турнира / Видео). Я не уверен, куда поместить оператор JOIN, но я думаю, что он внутри контроллера.

Проблема, с которой я столкнулся, заключается в том, что при нажатии на раунд он дает мне видео этого раунда, но для всех турниров, а не для одного турнира.

Также посмотрел здесь:
http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

CakePHP найти HABTM

Круглая модель:

public $hasAndBelongsToMany = array(
    'Tournament' => array(
        'className' => 'Tournament',
        'joinTable' => 'rounds_tournaments',
        'foreignKey' => 'round_id',
        'associationForeignKey' => 'tournament_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    ),
    'Video' => array(
        'className' => 'Video',
        'joinTable' => 'rounds_videos',
        'foreignKey' => 'round_id',
        'associationForeignKey' => 'video_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    )
);

Модель видео:

public $belongsTo = array(
    'Tournament' => array(
        'className' => 'Tournament',
        'foreignKey' => 'tournament_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),

public $hasAndBelongsToMany = array(
    'Round' => array(
        'className' => 'Round',
        'joinTable' => 'rounds_videos',
        'foreignKey' => 'video_id',
        'associationForeignKey' => 'round_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    )
);

Модель турнира:

public $hasMany = array(
    'Video' => array(
        'className' => 'Video',
        'foreignKey' => 'tournament_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

public $hasAndBelongsToMany = array(
    'Round' => array(
        'className' => 'Round',
        'joinTable' => 'rounds_tournaments',
        'foreignKey' => 'tournament_id',
        'associationForeignKey' => 'round_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    ),
);

Модель RoundsVideo:

public $belongsTo = array(
    'Round' => array(
        'className' => 'Round',
        'foreignKey' => 'round_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Video' => array(
        'className' => 'Video',
        'foreignKey' => 'video_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Модель RoundsTournament:

public $belongsTo = array(
    'Round' => array(
        'className' => 'Round',
        'foreignKey' => 'round_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Tournament' => array(
        'className' => 'Tournament',
        'foreignKey' => 'tournament_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Что я пробовал:

индексное действие VideosController

$this->Video->recursive = -1;
    $options['joins'] = array(
        array('table' => 'rounds_videos',
            'alias' => 'RoundsVideo',
            'type' => 'inner',
            'conditions' => array(
                'Video.video_id = RoundsVideo.video_id'
            )
        ),
        array('table' => 'rounds',
            'alias' => 'Round',
            'type' => 'inner',
            'conditions' => array(
                'RoundsVideo.round_id = Round.round_id'
            )
        )
    );

    $this->set('videos', $this->Paginator->paginate());

индекс действия TournamentsController

$this->Tournament->recursive = -1;
    $options['joins'] = array(
        array('table' => 'rounds_tournaments',
            'alias' => 'RoundsTournament',
            'type' => 'inner',
            'conditions' => array(
                'Tournament.tournament_id = RoundsTournament.tournament_id'
            )
        ),
        array('table' => 'rounds',
            'alias' => 'Round',
            'type' => 'inner',
            'conditions' => array(
                'RoundsTournament.round_id = Round.round_id'
            )
        )
    );
    $this->set('tournaments', $this->Paginator->paginate());

0 ответов

Другие вопросы по тегам