【问题标题】:Yii2 is there a way to specify tablename in ActiveQuery conditions (like andWhere) in a nice and short wayYii2 有没有一种方法可以在 ActiveQuery 条件(如 andWhere)中以一种简洁的方式指定表名
【发布时间】:2018-04-08 22:47:52
【问题描述】:

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

不喜欢一直这样做(尤其是在没有连接的地方,但只是为了能够在需要时将这些方法与连接一起使用):

// in the ActiveQuery method initialized from the model with tableName "company"
$this->andWhere(['{{%company}}.`company_id`' => $id]);

使“命名范围”适用于某些带有连接的情况..

另外,在这种情况下 [[..]] 是什么意思,例如:

$this->andWhere(['[[company_id]]' => $id]);

似乎无法解决上述问题。

提前谢谢!

附:抱歉,没有足够的声誉来创建标签 yii2-active-query

【问题讨论】:

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

标签: yii2


【解决方案1】:

获取真实的表名:

类:

ModelName::getTableSchema()->fullName

对象:

$model::getTableSchema()->fullName

【讨论】:

    【解决方案2】:

    您的问题是一个非常常见的问题,并且最常发生在诸如 descriptionnotes 等字段中。

    解决方案

    代替

    $this->andWhere(['description'=>$desc]); 
    

    你只需要写

    $this->andWhere(['mytable.description'=>$desc]);
    

    完成!只需在字段前面添加表名。创建原始 SQL 时,表名和字段名都会被自动引用。

    陷阱

    上面的示例解决了您在查询类中的问题。一个我挣扎并花了我相当长的时间解决的一个模型关系!如果您在查询期间加入其他表(不止一个),您也可能遇到此问题,因为模型中的关系方法不合格。

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

    public function getTeacher()
    {
        return $this->hasOne(Teacher::className(), ['teacher.id' => 'class.teacher_id']);
    }
    

    提案

    在开发模型和查询类时,始终完全限定字段。你永远不会再遇到这个问题......至少这是我的经验!我实际上创建了自己的模型-gii-模板。所以现在这个问题会自动解决;)

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-22
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2013-03-08
      • 1970-01-01
      • 2020-08-10
      相关资源
      最近更新 更多