Laravel - PDO - Имена динамических таблиц

Я пытаюсь удалить таблицу с динамическим именем. На самом деле я создаю таблицы и манипулирую ими динамически, но это самый простой из запросов.

Все работает нормально, когда я использую необработанный PDO, например:

// PURE PDO VERSION
$this->db = new PDO(
    'mysql:host='   . $configParams['db_hostname']
    . ';port='      . $configParams['db_port']
    . ';dbname='    . $configParams['db_name']
    . ';charset=utf8mb4',
    $configParams['db_username'],
    $configParams['db_password']
);

$this->ps_DeleteTempTable = $db->prepare(
            "DROP TABLE `:tableName`"
        );

Но когда я делаю то же самое, используя Laravel, вот так:

// LARAVEL VERSION
$pdo = DB::connection()->getPdo();

$this->ps_DeleteTempTable = $pdo->prepare(
            "DROP TABLE `:tableName`"
        );

Я получаю следующую ошибку:

SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146 Таблица 'testdb.?' не существует

Я видел и другие вопросы по SO с аналогичными целями, но все они предполагают, что первый запрос, который я написал, не может работать, тогда как я использую его более года.

Спасибо,


person mils    schedule 07.06.2017    source источник
comment
Если у вас это действительно сработало, я не могу это объяснить, потому что заполнители должны работать только для значений, а не для имен столбцов или таблиц.   -  person Qirel    schedule 07.06.2017
comment
У меня работает с обратными кавычками, создаю / вставляю / обновляю / удаляю без проблем. Просто странно, что при прохождении laravel он перестает работать.   -  person mils    schedule 07.06.2017
comment
Это довольно загадочно, если у вас это действительно работает ... Потому что при подготовке одинарные кавычки автоматически добавляются вокруг значений - вы должны получить запрос, похожий на DROP TABLE `testdb.'table'` - что недопустимо. Какая версия PHP и MySQL у вас установлена? Можете ли вы также показать, как вы выполняете связывание?   -  person Qirel    schedule 07.06.2017


Ответы (1)


Вы должны добавить имя таблицы в качестве значения при построении SQL ...

$pdo = DB::connection()->getPdo();

$this->ps_DeleteTempTable = $pdo->prepare(
            "DROP TABLE `".$tableName."`"
        );

Если не использовать обратные галочки, вы можете получить странные результаты, поскольку имена могут быть зарезервированными словами. В общем, лучше спроектировать базу данных так, чтобы они не использовались, но некоторые из них довольно распространены (например, «порядок»).

person Nigel Ren    schedule 07.06.2017