【问题标题】:Yii2: How to do a simple join query?Yii2:如何做一个简单的join查询?
【发布时间】:2017-09-01 13:32:36
【问题描述】:

我正在学习如何使用 Yii2 框架进行简单查询。我使用 PostgreSQL。

我正在尝试加入两个表并从具有 where 条件的两个表中获取数据。

这些表称为 AdminsPersons。 名为 idadm 的联接使用字段。

条件是idadm = 33。这很好用,但结果只有 Admins 表中的数据,我需要其他表中的数据。

这是我的例子:

$query = \app\models\Admins::find()
    ->select('*')
    ->leftJoin('persons', 'persons.idadm = admins.idadm')
    ->where(['admins.idadm' => 33])
    ->with('persons')
    ->all();

我在关注 Yii2 官方指南:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

更新:这里我展示了不能解决问题的更新代码:

【问题讨论】:

  • 尝试不使用select()
  • @MayankVadiya 它也是如此。 Persons 表中没有数据。
  • select('admin.*','persons.*') 然后试试这个
  • @MayankVadiya 同样 id 不显示来自 Persons 表的数据。我使用以下方法显示数据:print_r($query)。没事吧?
  • 有什么理由让你这么辛苦,而不是使用 Yii 内置的独立于数据库的 Active 记录和关系?

标签: postgresql yii2 yii2-advanced-app


【解决方案1】:

您需要在 select() 中写入所有列名。

$query = \app\models\Admins::find()
    ->select('admin.*,persons.*')  // make sure same column name not there in both table
    ->leftJoin('persons', 'persons.idadm = admins.idadm')
    ->where(['admins.idadm' => 33])
    ->with('persons')
    ->all();

你还需要在 Admin 模型中定义人员表属性。

第二种方式是以数组的形式获取记录,所以你不需要在Admin模型中定义属性。

$query = \app\models\Admins::find()
    ->select('admin.*,persons.*')  // make sure same column name not there in both table
    ->leftJoin('persons', 'persons.idadm = admins.idadm')
    ->where(['admins.idadm' => 33])
    ->with('persons')
    ->asArray()
    ->all();

【讨论】:

  • 这两个函数只显示来自 Admins 表的数据。 Persons 表中没有数据。
【解决方案2】:

确保活动记录具有所需的关系,例如如下所示:

class Admins extends \yii\db\ActiveRecord {
    public function table() { 
        return "admins";
    }
    public function getPersons() 
    {
        return $this->hasMany(Person::className(), ['idadm' => 'idadm']);
    }    
}

class Person  extends \yii\db\ActiveRecord { 
    public function table() {
        return "persons";
    }    
} 

然后使用joinWith构建查询:

$query  = Admins::find()
           ->joinWith('persons')
           ->limit(1);

$result = $query->createCommand()->getSql();
echo $result;

这里是生成的查询:

SELECT `admins`.* FROM `admins` 
LEFT JOIN `person` ON `admins`.`idadm` = `person`.`idadm` LIMIT 1

【讨论】:

  • 第一个解决方案是完全可重复使用的,我需要连接到$admin->person
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多