TableRegistry 关联不同于模型关联
TableRegistry association different than Model association
我希望 Bake 允许在相同的 table 之间使用多个外键。多个 belongsTo 和多个 HABTM(使用多个 joinTables)。
我对 belongsTo 部分没有任何问题,但我正在努力实现多个 HABTM tables。
我的语法如下所示:
[joinTable, prefix, [joined Tables Array]],
["in_protocols_plant_controllers", "in", ["protocols", "plant_controllers"]],
["out_protocols_plant_controllers", "out", ["protocols", "plant_controllers"]]
前缀用于产生不同的别名关联名称。
我编辑了 ModelTask,我的模型文件现在看起来像我想要的那样。
这是我在 return $associations
.
之前添加到 ModelTask.findBelongsToMany( ) 的内容
foreach (Configure::read("specialBelongsToMany") as $elem) {
$joinTableName = $elem[0];
if (!in_array($joinTableName, $tables)) { debug($elem); die(); }
$prefix = $elem[1];
$conTables = $elem[2];
$currIndex = array_search($tableName, $conTables);
if ($currIndex !== false) {
$otherIndex = $currIndex == 0 ? 1 : 0;
$otherTableName = $conTables[$otherIndex];
if (!in_array($otherTableName, $tables)) { debug($elem); die(); }
$assoc = [
'alias' => $this->_camelize($prefix . "_" . $otherTableName),
'className' => $this->_camelize($otherTableName),
'foreignKey' => $this->_modelKey($tableName),
'targetForeignKey' => $this->_modelKey($otherTableName),
'joinTable' => $joinTableName
];
$associations['belongsToMany'][] = $assoc;
}
}
我的power_analyzers由此产生的关联看起来像
[
'belongsTo' => [
(int) 0 => [
'alias' => 'Manufacturers',
'className' => 'Contacts',
'foreignKey' => 'manufacturer_id'
]
],
'hasMany' => [],
'belongsToMany' => [
(int) 0 => [
'alias' => 'PlantControllers',
'foreignKey' => 'power_analyzer_id',
'targetForeignKey' => 'plant_controller_id',
'joinTable' => 'plant_controllers_power_analyzers'
]
]
]
除了 ModelTask 中的 findbelongsto() 之外,我没有为我的多个 belongsTo 逻辑和上述代码编辑任何其他内容。
但是由于某些原因 TableRegistry::get() 返回的不是现有的关联,我不知道如何解决这个问题。
TableRegistry::get() in ControllerTask.php returns in function bake() this modelobject for power_analyzers
object(App\Model\Table\PowerAnalyzersTable) {
'registryAlias' => 'PowerAnalyzers',
'table' => 'power_analyzers',
'alias' => 'PowerAnalyzers',
'entityClass' => 'App\Model\Entity\PowerAnalyzer',
'associations' => [
(int) 0 => 'manufacturers',
(int) 1 => 'plantcontrollers',
(int) 2 => 'plantcontrollerspoweranalyzers',
**(int) 3 => 'inplantcontrollers',** // i dont want this
**(int) 4 => 'outplantcontrollers'** // i dont want this
],
'behaviors' => [
(int) 0 => 'Timestamp',
(int) 1 => 'Search'
],
'defaultConnection' => 'default',
'connectionName' => 'default'
}
这是我的 database schema 的片段。 returns power_analyzers 和 power_controller_features 与 in_protocols_plan_controllers 和 out_protocols_plant_controllers 相连,反之亦然。 ModelTask 中未返回此关联。
TableRegistry 的信息保存在哪里?为什么它会保存相应模型文件中未列出的关联?我如何通过 TableRegistry 修复?我希望你能帮助我。
TableRegistry 肯定是从ModelTask 中获取数据,但是为什么它连接了不同的HABTM 关联?没有我的修改它不会。
我对此有疑问,因为我的控制器现在试图在他们的查找中包含不存在的关联。
感谢您的帮助!
编辑:
我尝试了更多,发现 table 对象发生了变化,而 ModelTask.php 是 运行。这两个不需要的关联在协议 table 的 ModelTask bake() 完成后添加(在 $this->bakeTest 之后但在函数结束之前)。这是引入关联的table。
但是我不明白为什么协议的关联也被添加到 power_analyzers 关联中。而更让我困惑的是,table对象在bakeTest()之后发生了变化。 bakeTest 和关联有什么关系。
如果我知道关联 (int) 2 => 'plantcontrollerspoweranalyzers',
被添加到 table 对象的位置,也许它会对我有所帮助。这是通缉行为。我认为我的修改不起作用,我必须修改那部分。
我的烘焙过程总是很干净。我正在使用 python 脚本在烘焙前删除所有旧内容。
感谢您迄今为止的帮助!
编辑 2:
从 Table::belongsToMany() 找到了踪迹。我会在接下来的几天进行调查。
########## DEBUG ##########
'power_analyzers InPlantControllers'
###########################
Cake\ORM\Table::belongsToMany() - CORE\src\ORM\Table.php, line 1117
Cake\ORM\Association\BelongsToMany::_generateTargetAssociations() - CORE\src\ORM\Association\BelongsToMany.php, line 364
Cake\ORM\Association\BelongsToMany::junction() - CORE\src\ORM\Association\BelongsToMany.php, line 322
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 459
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::generateFixtureList() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 424
Bake\Shell\Task\TestTask::bake() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 231
App\Shell\Task\ModelTask::bakeTest() - APP/Shell\Task\ModelTask.php, line 1195
App\Shell\Task\ModelTask::bake() - APP/Shell\Task\ModelTask.php, line 118
App\Shell\Task\ModelTask::main() - APP/Shell\Task\ModelTask.php, line 101
Bake\Shell\BakeShell::Bake\Shell\{closure}() - ROOT\vendor\cakephp\bake\src\Shell\BakeShell.php, line 259
Cake\Collection\Collection::each() - CORE\src\Collection\CollectionTrait.php, line 51
Bake\Shell\BakeShell::all() - ROOT\vendor\cakephp\bake\src\Shell\BakeShell.php, line 260
Cake\Console\Shell::runCommand() - CORE\src\Console\Shell.php, line 493
Cake\Console\CommandRunner::run() - CORE\src\Console\CommandRunner.php, line 141
[main] - ROOT\bin\cake.php, line 12
我发现 TestTask 在所有调用 Cake\ORM\Association::junction()
的关联上 运行,它添加了 "missing" 关联。我不想编辑 cakephp 的核心文件。相反,我通过在 TestTask::_processModel()
的开头添加此代码来避免 TestTask 调用联结函数
foreach (Configure::read("specialBelongsToMany") as $elem) {
$joinTableName = $elem[0];
$prefix = $elem[1];
$conTables = $elem[2];
foreach ($conTables as $conTable) {
$conAlias = Inflector::camelize($prefix . "_" . $conTable);
if ($conAlias == $subject->alias()) {
return;
}
}
}
我希望 Bake 允许在相同的 table 之间使用多个外键。多个 belongsTo 和多个 HABTM(使用多个 joinTables)。
我对 belongsTo 部分没有任何问题,但我正在努力实现多个 HABTM tables。 我的语法如下所示:
[joinTable, prefix, [joined Tables Array]],
["in_protocols_plant_controllers", "in", ["protocols", "plant_controllers"]],
["out_protocols_plant_controllers", "out", ["protocols", "plant_controllers"]]
前缀用于产生不同的别名关联名称。
我编辑了 ModelTask,我的模型文件现在看起来像我想要的那样。
这是我在 return $associations
.
foreach (Configure::read("specialBelongsToMany") as $elem) {
$joinTableName = $elem[0];
if (!in_array($joinTableName, $tables)) { debug($elem); die(); }
$prefix = $elem[1];
$conTables = $elem[2];
$currIndex = array_search($tableName, $conTables);
if ($currIndex !== false) {
$otherIndex = $currIndex == 0 ? 1 : 0;
$otherTableName = $conTables[$otherIndex];
if (!in_array($otherTableName, $tables)) { debug($elem); die(); }
$assoc = [
'alias' => $this->_camelize($prefix . "_" . $otherTableName),
'className' => $this->_camelize($otherTableName),
'foreignKey' => $this->_modelKey($tableName),
'targetForeignKey' => $this->_modelKey($otherTableName),
'joinTable' => $joinTableName
];
$associations['belongsToMany'][] = $assoc;
}
}
我的power_analyzers由此产生的关联看起来像
[
'belongsTo' => [
(int) 0 => [
'alias' => 'Manufacturers',
'className' => 'Contacts',
'foreignKey' => 'manufacturer_id'
]
],
'hasMany' => [],
'belongsToMany' => [
(int) 0 => [
'alias' => 'PlantControllers',
'foreignKey' => 'power_analyzer_id',
'targetForeignKey' => 'plant_controller_id',
'joinTable' => 'plant_controllers_power_analyzers'
]
]
]
除了 ModelTask 中的 findbelongsto() 之外,我没有为我的多个 belongsTo 逻辑和上述代码编辑任何其他内容。
但是由于某些原因 TableRegistry::get() 返回的不是现有的关联,我不知道如何解决这个问题。 TableRegistry::get() in ControllerTask.php returns in function bake() this modelobject for power_analyzers
object(App\Model\Table\PowerAnalyzersTable) {
'registryAlias' => 'PowerAnalyzers',
'table' => 'power_analyzers',
'alias' => 'PowerAnalyzers',
'entityClass' => 'App\Model\Entity\PowerAnalyzer',
'associations' => [
(int) 0 => 'manufacturers',
(int) 1 => 'plantcontrollers',
(int) 2 => 'plantcontrollerspoweranalyzers',
**(int) 3 => 'inplantcontrollers',** // i dont want this
**(int) 4 => 'outplantcontrollers'** // i dont want this
],
'behaviors' => [
(int) 0 => 'Timestamp',
(int) 1 => 'Search'
],
'defaultConnection' => 'default',
'connectionName' => 'default'
}
这是我的 database schema 的片段。 returns power_analyzers 和 power_controller_features 与 in_protocols_plan_controllers 和 out_protocols_plant_controllers 相连,反之亦然。 ModelTask 中未返回此关联。
TableRegistry 的信息保存在哪里?为什么它会保存相应模型文件中未列出的关联?我如何通过 TableRegistry 修复?我希望你能帮助我。
TableRegistry 肯定是从ModelTask 中获取数据,但是为什么它连接了不同的HABTM 关联?没有我的修改它不会。
我对此有疑问,因为我的控制器现在试图在他们的查找中包含不存在的关联。
感谢您的帮助!
编辑:
我尝试了更多,发现 table 对象发生了变化,而 ModelTask.php 是 运行。这两个不需要的关联在协议 table 的 ModelTask bake() 完成后添加(在 $this->bakeTest 之后但在函数结束之前)。这是引入关联的table。 但是我不明白为什么协议的关联也被添加到 power_analyzers 关联中。而更让我困惑的是,table对象在bakeTest()之后发生了变化。 bakeTest 和关联有什么关系。
如果我知道关联 (int) 2 => 'plantcontrollerspoweranalyzers',
被添加到 table 对象的位置,也许它会对我有所帮助。这是通缉行为。我认为我的修改不起作用,我必须修改那部分。
我的烘焙过程总是很干净。我正在使用 python 脚本在烘焙前删除所有旧内容。
感谢您迄今为止的帮助!
编辑 2:
从 Table::belongsToMany() 找到了踪迹。我会在接下来的几天进行调查。
########## DEBUG ##########
'power_analyzers InPlantControllers'
###########################
Cake\ORM\Table::belongsToMany() - CORE\src\ORM\Table.php, line 1117
Cake\ORM\Association\BelongsToMany::_generateTargetAssociations() - CORE\src\ORM\Association\BelongsToMany.php, line 364
Cake\ORM\Association\BelongsToMany::junction() - CORE\src\ORM\Association\BelongsToMany.php, line 322
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 459
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::_processModel() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 456
Bake\Shell\Task\TestTask::generateFixtureList() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 424
Bake\Shell\Task\TestTask::bake() - ROOT\vendor\cakephp\bake\src\Shell\Task\TestTask.php, line 231
App\Shell\Task\ModelTask::bakeTest() - APP/Shell\Task\ModelTask.php, line 1195
App\Shell\Task\ModelTask::bake() - APP/Shell\Task\ModelTask.php, line 118
App\Shell\Task\ModelTask::main() - APP/Shell\Task\ModelTask.php, line 101
Bake\Shell\BakeShell::Bake\Shell\{closure}() - ROOT\vendor\cakephp\bake\src\Shell\BakeShell.php, line 259
Cake\Collection\Collection::each() - CORE\src\Collection\CollectionTrait.php, line 51
Bake\Shell\BakeShell::all() - ROOT\vendor\cakephp\bake\src\Shell\BakeShell.php, line 260
Cake\Console\Shell::runCommand() - CORE\src\Console\Shell.php, line 493
Cake\Console\CommandRunner::run() - CORE\src\Console\CommandRunner.php, line 141
[main] - ROOT\bin\cake.php, line 12
我发现 TestTask 在所有调用 Cake\ORM\Association::junction()
的关联上 运行,它添加了 "missing" 关联。我不想编辑 cakephp 的核心文件。相反,我通过在 TestTask::_processModel()
foreach (Configure::read("specialBelongsToMany") as $elem) {
$joinTableName = $elem[0];
$prefix = $elem[1];
$conTables = $elem[2];
foreach ($conTables as $conTable) {
$conAlias = Inflector::camelize($prefix . "_" . $conTable);
if ($conAlias == $subject->alias()) {
return;
}
}
}