Как выбрать все столбцы, кроме одного в Yii2?

0

Мне нужно выбрать все столбцы базы данных, кроме одного.

У меня есть что-то вроде:

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

Он выбирает все столбцы, но как сделать этот один столбец не будет выбран? Очевидно, я могу сказать, чтобы выделить определенные столбцы:

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

Но таблица базы данных действительно большая, поэтому я ищу подходящий способ сделать это.

Есть идеи? Спасибо за ваше время

Теги:
yii2

2 ответа

1

Вы не должны упоминать self::tableName(). '.column1', 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]);

}

Затем мы имеем отсортированный массив без поля, которое не требуется.

Теперь вы передаете отсортированный массив в запрос как

$foo = self::find()
  ->select([
  $array
 ]);
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());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню