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