如何在CakePHP v3中动态删除关联

时间:2016-09-01 22:50:22

标签: cakephp orm cakephp-3.0

在CakePHP的早期版本中,您可以暂时改变与Table::bindModel('SomeModel');的关联,但我无法弄清楚如何在v3中执行此操作。

我想暂时禁用在Table类中定义的hasMany关联,因为当我运行在该表存在之前编写的较旧迁移时,它会导致错误。我不完全理解迁移问题,但是当我在Table类中注释掉关联时它会立即消失。

class AgenciesTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('agencies');
        $this->displayField('full_name');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');

        $this->hasMany('Routes');

enter image description here

1 个答案:

答案 0 :(得分:1)

这里的问题是,在使用迁移时,依赖于实际的模型类。这可能会导致您刚刚遇到的问题。

而是直接使用TableRegistry或Table对象,并创建一个没有任何依赖关系的表对象。直接在该对象上加载您需要的关联。

$agencies = new Table(['table' => 'agencies', /*...*/]);
$agencies->belongsTo('Whatever');
/* Do your data manipulation */

这样,无论您对AgenciesTable类进行了哪些其他更改,迁移都将起作用。这是恕我直言,这是在迁移中这样做的正确方法。

我认为,即使你没有通过调用$this->hasMany('Routes');来显式创建关联,你也会得到同样的错误,因为eager loader仍然会尝试找到匹配的表类,动态加载它。这也是为什么没有" untain"方法

此外,您还没有显示您的实际查询代码...所以我假设您正在调用自定义查找或在某处调用Query :: contains()的方法。只需编写一个没有包含的新查询?

$agencies->find()->contain(['One', 'Two'])->where([/*...*/])->all();

如果您有一个大查询,最好将其分解为更多自定义查找,因为它们可以合并:

$agencies->find('withoutMyContain')->all();
$agencies->find('withoutMyContain')->find('withMyContain')->all();

请参阅Custom Finder Methods