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;
        }
    }
}