Yii2有没有一种方法可以在ActiveQuery条件(如andWhere)中以简洁的方式指定tablename

Yii2有没有一种方法可以在ActiveQuery条件(如andWhere)中以简洁的方式指定tablename,yii2,Yii2,我使用联接进行查询(使用\yii\db\ActiveQuery),并且“where”子句中的一些字段变得模棱两可。在列名之前,是否有一种简洁的方法来指定当前模型(ActiveRecord)表的名称(ActiveQuery是从哪个表实例化的)?所以我可以在任何情况下一直使用它,并使其简短 我不喜欢一直这样做smth(特别是在没有连接的地方,但只要能够在需要时将这些方法与连接一起使用即可): 要使“命名作用域”适用于某些具有联接的情况 还有,在这种情况下,[..]]是什么意思,比如: $this-&

我使用联接进行查询(使用\yii\db\ActiveQuery),并且“where”子句中的一些字段变得模棱两可。在列名之前,是否有一种简洁的方法来指定当前模型(ActiveRecord)表的名称(ActiveQuery是从哪个表实例化的)?所以我可以在任何情况下一直使用它,并使其简短

我不喜欢一直这样做smth(特别是在没有连接的地方,但只要能够在需要时将这些方法与连接一起使用即可):

要使“命名作用域”适用于某些具有联接的情况

还有,在这种情况下,[..]]是什么意思,比如:

$this->andWhere(['[[company_id]]' => $id]);
似乎无法解决上述问题

提前谢谢


另外,很抱歉,没有足够的声誉来创建tag yii2活动查询

您的问题非常常见,最常见的是liek
description
notes
等字段

解决方案 而不是

$this->andWhere(['description'=>$desc]); 
你只要写

$this->andWhere(['mytable.description'=>$desc]);
完成了!只需在字段前面添加表名。创建原始SQL时,表名和字段名都将被自动引用

陷阱 上面的示例解决了查询类中的问题。我挣扎了很久才解决的一个问题是模型关系!如果在查询过程中加入其他表(不止一个),也可能会遇到此问题,因为模型中的关系方法不合格

示例:如果有三个表:学生、班级和教师。学生和教师可能与班级有关,并且都有一个FK字段
班级id
。现在,如果你从学生到教师(
$student->class->teacher
)。您还将得到模糊错误。这里的问题是,您还应该在模型中限定您的关系定义

public function getTeacher()
{
    return $this->hasOne(Teacher::className(), ['teacher.id' => 'class.teacher_id']);
}
提议 在开发模型和查询类时,始终完全限定字段。你再也不会遇到这个问题了……至少这是我的经历!我实际上创建了自己的模型gii模板。所以这个问题现在可以自动解决;)


希望有帮助

要获取实际表名:

类别:

ModelName::getTableSchema()->fullName
对象:

$model::getTableSchema()->fullName

我相信它不存在于ActiveQuery类中,至少根据文档是这样的。如果需要,您实际上可以在where语句中使用
tablename.fieldname
。您可以使用andWhere(['u.
company\u id
'=>$id]);其中u是原始表,为了可读性,尽管我会继续使用{{%company}
$model::getTableSchema()->fullName