Мне нужно выбрать все столбцы базы данных, кроме одного.
У меня есть что-то вроде:
$foo = self::find()
->select([
self::tableName() . '.*'
]);
Он выбирает все столбцы, но как сделать этот один столбец не будет выбран? Очевидно, я могу сказать, чтобы выделить определенные столбцы:
$foo = self::find()
->select([
self::tableName() . '.column1',
self::tableName() . '.column2',
self::tableName() . '.column3'
...
]);
Но таблица базы данных действительно большая, поэтому я ищу подходящий способ сделать это.
Есть идеи? Спасибо за ваше время
Вы не должны упоминать 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
]);
В качестве варианта вы можете динамически формировать список столбцов и использовать его
// 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());