我是个新手。我设计了一个mysql数据库,其中包含一个InnoDB表CompetitionRegions,其中有一个外键引用该表本身。外键约束已到位。
蛋糕烘焙无法自动生成正确的代码,因为自联接表别名与第一个别名相同:
SQLSTATE[42000]:语法错误或访问冲突:1066不是唯一的表/别名:"CompetitionRegions"
SELECT CompetitionRegions.id AS `CompetitionRegions__id`, CompetitionRegions.name AS `CompetitionRegions__name`, CompetitionRegions.parent_competition_region_id AS `CompetitionRegions__parent_competition_region_id` FROM competition_regions CompetitionRegions LEFT JOIN competition_regions CompetitionRegions ON CompetitionRegions.id = (CompetitionRegions.parent_competition_region_id) LIMIT 20 OFFSET 0
我该如何解决此问题?
类CompetitionRegionsTable::initialize包含以下内容:
$this->belongsTo('CompetitionRegions', [
'foreignKey' => 'parent_competition_region_id'
]);
有没有一种方法可以指定用于自联接子查询的别名?
第一个参数用作别名,因此您必须更改它。为了让CakePHP仍然使用CompetitionRegionsTable
类,您需要通过className
选项指定它。
$this->belongsTo('ParentCompetitionRegions', [
'className' => 'CompetitionRegions',
// the foreign key options isn't actually necessary with a matching alias
'foreignKey' => 'parent_competition_region_id'
]);
另请参阅Cookbook>数据库访问&ORM>关联>将表链接在一起
[…]如您所见,通过指定
className
键,可以将同一个表用作同一表的不同关联。您甚至可以创建自关联表来创建父子关系〔…〕
我无法让它单独使用ndm提出的解决方案。它给出了另一个问题(ParentCompetitionRegions关联不存在),我可能无法解决,因为我对CakePHP没有任何经验。
经过更多的研究,我所要做的就是将外键从parent_competition_regio_id重命名为parent_id。显然,在这种情况下,蛋糕烘焙得到了一个自我参照领域的想法。