通过列别名与 CakePHP 模型的多个 hasMany 关联
Multiple hasMany associations with CakePHP model via column aliases
我正在为我的垒球队制作一个小应用程序。我想建立以下关联:
模型 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' => ''
)
);
出现以下错误:
注:"Psychouts"是下面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
FROM psychouts
.games
AS Game
LEFT JOIN psychouts
.teams
AS Home
ON (Game
.home_id
= Home
.id
) LEFT JOIN psychouts
.teams
AS Away
ON (Game
.away_id
= Away
.id
) WHERE 1 = 1 LIMIT 20
根据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' => ''
),
);
我正在为我的垒球队制作一个小应用程序。我想建立以下关联:
模型 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' => ''
)
);
出现以下错误:
注:"Psychouts"是下面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
FROM psychouts
.games
AS Game
LEFT JOIN psychouts
.teams
AS Home
ON (Game
.home_id
= Home
.id
) LEFT JOIN psychouts
.teams
AS Away
ON (Game
.away_id
= Away
.id
) WHERE 1 = 1 LIMIT 20
根据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' => ''
),
);