Мне нужно проверить, существует ли таблица в базе данных. В настоящее время я разрабатываю с использованием Yii2.
Мой случай немного отличается от этот вопрос потому что проверяемая таблица не является (и не может быть) моделью.
я пытался (new \yii\db\Query())->select('*')->from($mysticTable)->exists());
Вышеуказанное выбрасывает yii\db\Exception
потому что, согласно вопросу, связанному выше, yii\db\Query()
класс пытается ->queryScalar()
когда спросили, если ->exists()
, Этот метод неизменно проверяет, существует ли набор результатов.
Как я могу проверить, существует ли таблица?
Для Yii2 вы можете использовать:
$tableSchema = Yii::$app->db->schema->getTableSchema('tableName');
Если таблица не существует, она вернется null
, так что вы можете проверить возвращаемое значение для того, чтобы быть null
:
if ($tableSchema === null) {
// Table does not exist
}
Вы можете найти этот метод в официальных документах Вот.
Хорошо, что вы получите исключение. Просто проанализируйте сообщение об исключении. Вы получите очень конкретное сообщение и код ошибки SQL для отсутствующей таблицы.
Это то, что я делаю при проверке, например Если ошибка произошла из-за чего-то, что может быть восстановлено, скажем, из-за разрыва соединения, по сравнению с какой-то другой ошибкой.
ИЛИ Я вижу, что многие люди указывали на гораздо более прямые способы получения этой информации.
Отключение @ msfoster’s ответ приблизил меня к решению в yii2
/**
* @param $tableName
* @param $db string as config option of a database connection
* @return bool table exists in schema
*/
private function tableExists($tableName, $db = null)
{
if ($db)
$dbConnect = \Yii::$app->get($db);
else
$dbConnect = \Yii::$app->get('db');
if (!($dbConnect instanceof \yii\db\Connection))
throw new \yii\base\InvalidParamException;
return in_array($tableName, $dbConnect->schema->getTableNames());
}
Это также обслуживает несколько баз данных.