2015-07-26 7 views
0

Я делаю небольшое приложение для своей команды софтбола. Я хочу, чтобы настроить следующие ассоциации:Несколько ассоциаций hasMany с моделью CakePHP через псевдонимы столбцов

Модель Game имеет две колонки, away_id, home_id, оба из которых являются псевдонимами к Team.id.

В Game модели у меня есть:

/** 
* belongsTo associations 
* 
* @var array 
*/ 
    public $belongsTo = array(
     'Home' => array(
      'className' => 'Team', 
      'foreignKey' => 'home_id', // also tried simply 'id' 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
     'Away' => array(
      'className' => 'Team', 
      'foreignKey' => 'away_id', // also tried simply 'id' 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 

В Team модели у меня есть:

public $virtualFields = ['home_id' => 'Team.id', 'away_id' => 'Team.id']; 

И:

/** 
* hasMany associations 
* 
* @var array 
*/ 
    public $hasMany = array(
     'Game' => array(
        'className' => 'Game', 
        'foreignKey' => 'home_id', 
        'dependent' => false, 
        'conditions' => '', 
        'fields' => '', 
        'order' => '', 
        'limit' => '', 
        'offset' => '', 
        'exclusive' => '', 
        'finderQuery' => '', 
        'counterQuery' => '' 
       ), 


// also tried only one 'Game' association with foreignKey => [home_id, away_id] 
     'Game' => array(
        'className' => 'Game', 
        'foreignKey' => 'away_id', 
        'dependent' => false, 
        'conditions' => '', 
        'fields' => '', 
        'order' => '', 
        'limit' => '', 
        'offset' => '', 
        'exclusive' => '', 
        'finderQuery' => '', 
        'counterQuery' => '' 
       ) 
    ); 

Getting следующее сообщение об ошибке:

Примечание: «Психопаты» - это единственное непонятное появление в SQL ниже; это имя базы данных (а также имя моей команды, henh).

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

SQL запросов: SELECT Game. id, Game. when, Game. cancelled, Game. field, Game. home_id, Game. away_id, Game. score_us, Game. score_them, Home. id, Home. captain_id, Home. name, Home. wins, Home. losses, Home. ties, Home. scored, Home. allowed, (Team) id) AS Home__home_id, (Team. id) AS Home__away_id, Away. id, Away. captain_id, Away. name, Away. wins, Away. losses, Away. ties, Away. scored, Away. allowed, (Team) id) AS Away__home_id, (Team. id) AS Away__away_id ОТ psychouts. games AS Game LEFT JOIN psychouts. teams AS Home ON (Game. home_id = Home. id) LEFT JOIN psychouts. () 0 0 0id) WHERE 1 = 1 LIMIT 20

+1

Это ваша проблема 'public $ virtualFields = ['home_id' => 'Team.id', 'away_id' => 'Team.id'];' - это определение виртуальных полей для (псевдонимов) таблиц, которые не существуют в запросе. Если вы удалите все хаки, которые у вас есть (включая вышеперечисленные виртуальные поля), он должен просто работать. Вы можете, если вам нужна команда Team-> hasMany-> Game, определяя 'foreignKey'false и добавляя' conditions => ['OR' => ['Game.home_id = Team.id', 'Game.away_id = Team .id ']] 'или подобное. – AD7six

ответ

0

После комментариев AD7six, решение, которое, после тестирования, кажется правильным является:

В Team модели, удалите виртуальные поля я предложенные и затем определить Game ассоциацию следующим образом :

/** 
* belongsTo associations 
* 
* @var array 
*/ 
    public $belongsTo = array(
     'Game' => array(
      'className' => 'Game', 
      'foreignKey' => ['OR' => ['Game.home_id = Team.id', 'Game.away_id = Team.id']] 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
    ); 

И в Game модели, определяют Team ассоциацию, как обычно:

/** 
* belongsTo associations 
* 
* @var array 
*/ 
    public $belongsTo = array(
     'Team' => array(
      'className' => 'Team', 
      'foreignKey' => 'id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ), 
    ); 
+0

Вышеприведенный массив '$ belongsTo' определяет ** только одну ассоциацию ** - потому что второй ключ массива' Team' просто перезапишет первый. – AD7six