在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');
答案 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();