我需要做的是选择除一个以外的所有数据库列。
我有类似的东西:
$foo = self::find()
->select([
self::tableName() . '.*'
]);
它选择了所有列,但如何选择一列不会被选中?显然,我可以告诉您选择这样的特定列:
$foo = self::find()
->select([
self::tableName() . '.column1',
self::tableName() . '.column2',
self::tableName() . '.column3'
...
]);
但是数据库表真的很大,所以我正在寻找一种合适的方法来实现它。
有什么想法吗?谢谢你的时间
答案 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());