Как усечь таблицу с помощью CakePHP? - PullRequest
9 голосов
/ 12 мая 2011

Я хочу обрезать свою таблицу базы данных, с моделью CakePHP, я использовал $this->Model->deleteAll код для того же самого, и она отлично работает.

Теперь, что я хочу, в следующий раз, когда мои новые записивставки, он должен начинаться ID только с 1, который не работает с функцией deleteAll, поэтому есть ли синтаксис CakePHP по умолчанию для создания таблицы Усечение ?

Дайте мне знать!

Ответы [ 3 ]

14 голосов
/ 12 мая 2011

ПРИМЕЧАНИЕ. Этот ответ действителен только до CakePHP 1.3.Я не использовал это в версиях never, поэтому не знаю, работает ли он.

deleteAll только удаляет данные, но не усекает таблицу.

Вам нужно будет вызвать метод query().

$this->Model->query('TRUNCATE TABLE table_name_in_mysql;')

http://book.cakephp.org/view/1027/query

3 голосов
/ 28 сентября 2013

@ JohnP не учитывает префикс таблицы, настроенный в database.php . Вот немного более надежный подход.

Объект DboSource , прикрепленный к каждой модели, уже имеет метод fullTableName () , который делает именно то, что нам нужно.

Сначала создайте Model/AppModel.php, если он еще не существует, и добавьте в него этот метод:

/**
 * fullTableName
 *
 * Provides access to the Model's DataSource's ::fullTableName() method.
 * Returns the fully quoted and prefixed table name for the current Model.
 *
 * @access public
 * @param boolean $quote Whether you want the table name quoted.
 * @param boolean $schema Whether you want the schema name included.
 * @return string  Full quoted table name.
 */
public function fullTableName($quote = true, $schema = true) {
    $datasource = $this->GetDataSource();
    return $datasource->fullTableName($this, $quote, $schema);
}

При этом вы можете получить полное имя таблицы, включая префикс, для любой модели в вашем приложении Cake:

$this->Model->fullTableName();

Хотя мы можем добиться большего. Затем добавьте этот метод в AppModel:

/**
 * truncate
 *
 * Truncates ALL RECORDS from the Model it is called from! VERY DANGEROUS!
 * Depends on the ::fullTableName() method to concatenate the configured
 * table prefix and table name together and quote the whole bit properly.
 *
 * @access  public
 * @return  mixed
 */
public function truncate() {
    $fullName = $this->fullTableName();
    $q = 'TRUNCATE TABLE %s';
    return $this->query(sprintf($q, $fullName));
}

Теперь вы можете (легко, так что будьте осторожны!) Обрезать любую модель в вашем приложении следующим образом:

$this->Model->truncate();

И если вам когда-либо понадобится настроить запрос SQL для соответствия другому источнику данных, вы можете сделать это в центральном месте вашего приложения. Вы также можете легко переопределить метод truncate() в определенных моделях, если они используют другой источник данных с другим синтаксисом.

0 голосов
/ 03 ноября 2015

Независимое от драйвера базы данных решение для CakePHP 3:

Создайте AppTable.php и сделайте так, чтобы все ваши таблицы расширяли этот.

Добавить к нему эту функцию:

public function truncate()
{
    $truncateCommands = $this->schema()->truncateSql($this->connection());
    foreach ($truncateCommands as $truncateCommand) {
        $this->connection()->query($truncateCommand);
    }
}

Затем просто вызовите $table->truncate();, и таблица должна обрезаться независимо от того, какой драйвер базы данных вы используете.

...