Как усечь таблицу с помощью CakePHP?


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

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

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

Author: Brian Tompsett - 汤莱恩, 2011-05-12

4 answers

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

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

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

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

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

 14
Author: JohnP, 2015-12-16 15:07:04

@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);
}

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

$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() в определенных моделях, если они используют другой источник данных с другим синтаксис.

 3
Author: beporter, 2014-01-20 16:30:31

Вставьте всегда истинное условие, например

$this->Model->deleteAll('1=1');
 0
Author: Stefano Caravana, 2012-11-14 10:06:49

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

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

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

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

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

 0
Author: btaens, 2015-11-03 15:32:07