0

我正在尝试为我的 DomainTypes view() 函数包含我的 DomainTypes 表的子项,但它抱怨“错误:SQLSTATE [42S22]:找不到列:1054 'where 子句'中的未知列'Children.domain_type_id'”问题是我的 DomainTypes 表没有 domain_type_id 列。域表可以。这是我的 DomainTypes view() 的代码:

public function view($id) {
    if (!$id) {
        throw new NotFoundException(__('Invalid DomainType'));
    }

    $domainType = $this->DomainTypes
        ->find()
        ->where(['DomainTypes.id' => $id])
        ->contain(['Parent', 'Children', 'Affiliates'])
        ->first();

    $this->set(compact('domainType'));
}

关于我的设置。我有 2 个表,域和域类型。两者都使用树行为。

这是域表的初始化代码:

public function initialize(array $config){
    parent::initialize($config);

    $this->displayField('name');
    $this->addBehavior('Tree');

    //Associations
    $this->hasMany('Children', [
        'className' => 'Domains',
    ]);
    $this->belongsTo('Parent', [
        'className' => 'Domains',
    ]);
    $this->belongsTo('Affiliates');
    $this->belongsTo('DomainTypes');
}

下面是 DomainTypes 表的初始化代码:

public function initialize(array $config){
    parent::initialize($config);

    $this->displayField('name');
    $this->addBehavior('Tree');

    //Associations
    $this->hasMany('Children', [
        'className' => 'DomainTypes',
    ]);
    $this->belongsTo('Parent', [
        'className' => 'DomainTypes',
    ]);
    $this->belongsTo('Affiliates');
    $this->hasMany('Domains');
}

两者非常相似,但也明确定义了要使用的 className。为什么 Cakephp 3 假设我的 DomainTypes 表上有一个 domain_type_id 列?提前致谢!

4

2 回答 2

0

更新我没有正确注意,并且 CakePHP 在自动生成名为 的外键时似乎实际上是正确的domain_type_id,它是一个hasMany关联,因此 FK 应该基于源表。

解决方案仍然相同,需要明确设置 FK,并且正如@MjGaiser 已经指出的那样,parent_id不需要关联,而是应该使用关联belongsTo的 FK而不是:hasManyparent_idchild_id

    $this->hasMany('Children', [
        'className' => 'DomainTypes',
        'foreignKey' => 'parent_id'
    ]);
    $this->belongsTo('Parent', [
        'className' => 'DomainTypes'
    ]);
于 2014-09-20T10:45:10.797 回答
0

我们都很亲近,但并不完全正确。ndm,您的回答很有帮助,因为它确实指出了我犯的另一个错误。最终的关联代码应如下所示:

    $this->hasMany('Children', [
        'className' => 'DomainTypes',
        'foreignKey' => 'parent_id',
    ]);
    $this->belongsTo('Parent', [
        'className' => 'DomainTypes',
    ]);

当我尝试输入外键时,我使用的不是“foreignKey”,而是几乎没用的“foreign_key”。感谢ndm的帮助。

于 2014-09-20T15:13:11.223 回答