在Yii2中,如何将表连接到自身?

时间:2015-06-17 19:14:30

标签: activerecord yii2 self-join

我有一个页面表。页面可以有父母,也可以是页面。我想选择parent_id = NULL及其'children'的所有页面。但是当我尝试这个时

public function getPages()
{
    return $this->hasMany(Page::className(), ['parent_id' => 'id']);
}

我得到一个1066不唯一的表/别名:'page'错误...我知道如何在Yii1中修复此问题,但我无法弄清楚在Yii2中修复它。

2 个答案:

答案 0 :(得分:4)

我已经为我的成绩单元做了这个,我的成绩是亲子关系。

请按照以下步骤操作:

  1. 在模型文件中编写此代码以进行自联接。我们需要别名表名。这里'parent'是别名。

    public function getParent() {
        return $this->hasOne(self::classname(), ['id' => 'parent_id'])->
                    from(self::tableName() . ' AS parent');
    }
    
  2. 在您的视图文件中编写此代码

    [
    
      'label' => 'Parent Grade',
    
      'value' => ($model->parent_id != '' || $model->parent_id != 0) ? $model->parent->name : 'Root Grade',
    
    ],
    
  3. 在我的代码中,如果parent_id字段不为null / 0,那么它将显示父级别名称,否则为“Root Grade”。

答案 1 :(得分:3)

您需要为表名设置别名。

 $this->hasMany(Category::className(), ['parent_id' => 'id'])->from(['cat' => 'category']);

参见讨论here