2012-01-22 2 views
2

Я создаю сайт MMA (смешанные боевые искусства) с CakePHP. У меня есть таблица fights в моей базе данных, которая имеет простейшие три столбца: id, fighter_a и fighter_b.Модели с двумя отношениями hasOne с тем же столом

У меня возникли проблемы с тем, что касается моей модели Fight с моим модулем Fighter. Правильно ли я думаю, что fighter_a и fighter_b были бы двумя отношениями hasOne?

Я попытался это следующее в моей Fight модели:

<?php 
class Fight extends AppModel { 

    public $name = 'Fight'; 
    public $hasOne = array(
     'FighterA' => array(
      'className' => 'Fighter', 
      'foreignKey' => 'fighter_a' 
     ), 
     'FighterB' => array(
      'className' => 'Fighter', 
      'foreignKey' => 'fighter_b' 
     ) 
    ); 
} 

и тогда это в моей Fighter модели:

<?php 
class Fighter extends AppModel { 

    public $name = 'Fighter'; 
    public $hasMany = array(
     'Fight' 
    ); 
} 

Но это бросил ошибку в моем CakePHP приложения при вызове $this->Fight->findById($id) (где $id был идентификатором истребителя):

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Fight.fighter_id' in 'field list'

Как я могу связать свои модели, чтобы я мог назвать все бои, в которых был боец?

+0

Проявляется ли ваше приложение в SQL отладке? Если да, не могли бы вы скопировать соответствующий запрос на свой вопрос? Возможно, вам необходимо определить ваш hasMany как homeFight и awayFight в зависимости от того, указан ли бойцов как Fighter A истребителя B. – Joep

+0

Конечно. Я думаю, что проблема заключается в том, когда я хочу запросить его, создавая Fighter. Скажем, я показываю профиль Брок Леснар. Я хочу показать историю его боя, поэтому любые записи, где его значение ID появляется в столбце 'fighter_a_id' или' fighter_b_id' таблицы 'боев', упорядочивается по дате по убыванию. –

+0

Это что-то вроде ответа не на самом деле (в том, что он не решает эту проблему), но я бы подумал только о том, чтобы получить Fights, чем. Другими словами: '$ this-> Fighter-> Fight-> find ('all', array ('conditions' => array ('OR' => array ('fighter_a_id' => $ id, 'fighter_b_id' = > $ id)))) ' – Joep

ответ

1

Дистиллированные из разговора под вопросом, решение будет такое:

Перепишите $ hasMany в вашем FighterModel выглядеть следующим образом:

public $hasMany = array(
     'Fight' => array(
     'className' => 'Fight', 
     'finderQuery' => 'SELECT * FROM fights AS Fight WHERE Fight.fighter_a_id = {$__cakeID__$} OR Fight.fighter_b_id = {$__cakeID__$};' 
    ) 
    ); 
+0

А, да! Я помню, что читал кое-что об этом. Благодарю. Я попробую и расскажу о том, как это происходит. –

Смежные вопросы