我有一个与自身有父子关系的表:
mysql> desc features;
+---------------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| featureID | varchar(45) | NO | | NULL | |
| probeID | int(11) | YES | | NULL | |
| shortName | varchar(45) | NO | | NA | |
| start | int(11) | NO | | NULL | |
| stop | int(11) | NO | | NULL | |
| strand | int(11) | NO | | NULL | |
| curatedManually | varchar(45) | NO | | NA | |
| created | timestamp | NO | | CURRENT_TIMESTAMP | |
| descriptions_id | int(11) | YES | MUL | NULL | |
| features_types_id | int(11) | NO | MUL | NULL | |
| chromosomes_id | int(11) | NO | MUL | NULL | |
| species_id | int(11) | NO | MUL | NULL | |
| strains_id | int(11) | NO | MUL | NULL | |
| parents_features_id | int(11) | YES | MUL | NULL | |
+---------------------+-------------+------+-----+-------------------+----------------+
相应的字段是 parents_features_id 和 id,因为一个特征可以有“子”特征或“父”特征。与该字段建立了外键关系。
KEY `fk_features_Features1_idx` (`parents_features_id`),
CONSTRAINT `fk_features_Features1` FOREIGN KEY (`parents_features_id`) REFERENCES `features` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
我使用“cake bake all features”来创建所有必要的模型、 Controller 等。
当我打开功能页面时,我只收到错误消息“功能与 ParentsFeatures 无关”
我尝试通过交换自动原码来解决
$this->belongsTo('Features', [
'foreignKey' => 'parents_features_id'
在 Model/Table/FeaturesTable.php 中通过以下代码为这种关系:
$this->belongsTo('ParentsFeatures', [
'className' => 'Features',
'foreignKey' => 'parents_features_id'
]);
$this->hasMany('ChildFeatures', [
'className' => 'Features',
'foreignKey' => 'parents_features_id'
但是我收到错误消息“功能与功能无关”
我有点卡在这里,非常感谢任何帮助解决这个问题。
一切顺利 纳丁
最佳答案
更改表中的关联不会改变烘焙 Controller 查询数据的方式,您也必须更改它们,或者重新烘焙代码。
但是,除非您开始遵循约定,否则这将永远无法正确烘焙,即将外键列命名为 parent_id
,只有这样 bake 才能创建正确的关联(将被命名为 ParentFeatures
和 ChildFeatures
),并且在您这样做的同时,考虑也更改其他列名称(小写下划线)。
也就是说,在重命名索引、创建和删除外键约束等之间的某处可能会出现一个错误(无法查明),然后导致错误的关联名称用于 contain
在find()
调用 Controller Action ,即烘焙将生成类似
'contain' => ['Features']
代替
'contain' => ['ParentFeatures']
它用于烘焙表类中的关联。
但是我现在无法可靠地重现它。如果这是您遇到的情况,您可能需要 report this as an issue over at GitHub .
如果重新烘焙无法解决问题,请手动检查 find()
调用您的 Controller 操作并将包含的关联更改为 ParentFeatures
.
关于php - 无法解决 cakephp 3 中的子父关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654388/