如何选择除Yii2中的一列以外的所有列?

时间:2017-12-22 07:05:24

标签: mysql yii2

我需要做的是选择除一个以外的所有数据库列。

我有类似的东西:

$foo = self::find()
  ->select([
     self::tableName() . '.*'
]);

它选择了所有列,但如何选择一列不会被选中?显然,我可以告诉您选择这样的特定列:

$foo = self::find()
  ->select([
      self::tableName() . '.column1',
      self::tableName() . '.column2',
      self::tableName() . '.column3'
      ...
  ]);

但是数据库表真的很大,所以我正在寻找一种合适的方法来实现它。

有什么想法吗?谢谢你的时间

2 个答案:

答案 0 :(得分:1)

您无需一直提及self::tableName() . '.column1',。 您可以在模型中的db表中添加所有文件,并按如下方式使用它们。

你的模型应该包含返回字段的方法,类似这样的

   public function fields() {
    return[
        'id',
        'column1',
        'column2',
        'column3',
        'created_at',
        'updated_at',
         etc...
    ];
}

然后您可以将字段调用到查询中,如

$foo = self::find()
->select([
  'column1',
  'column2',
  'column3',
  ...

]);

现在,回答你的问题,我们可以将所有字段称为self::fields(),它会返回表格中的字段数组。 然后,您可以通过执行类似的操作从我们获得的数组中删除该特定字段

if (($key = array_search('strawberry', $array)) !== false) {
unset($array[$key]);

}

然后,我们有没有不需要的字段的排序数组。

现在,您将已排序的数组传递给Query

$foo = self::find()
  ->select([
  $array
 ]);

答案 1 :(得分:0)

作为变体,您可以尝试动态形成列表并使用它

// variant 1
$columns = Yii::$app->db->createCommand("SELECT column_name FROM information_schema.columns WHERE table_name = 'user' AND table_schema = database()")->queryAll();

$out_columns = [];

foreach ($columns as $item) {
   if (! in_array($item['column_name'], ['auth_key', 'password_hash', 'password_reset_token'])) {
       $out_columns[] = $item['column_name'];
   }
}

print_r($out_columns);

print_r(User::find()->select($out_columns)->one());



// variant 2
$columns = Yii::$app->db->createCommand("SELECT column_name FROM information_schema.columns WHERE table_name = 'user' AND column_name NOT IN('auth_key', 'password_hash', 'password_reset_token') AND table_schema = database()")->queryAll();

$out_columns = [];

foreach ($columns as $item) {
   $out_columns[] = $item['column_name'];
}

print_r($out_columns);

print_r(User::find()->select($out_columns)->one());