Я делаю небольшое приложение для своей команды софтбола. Я хочу, чтобы настроить следующие ассоциации:Несколько ассоциаций 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
Это ваша проблема '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