Как усечь таблицу с помощью CakePHP?
Я хочу обрезать таблицу базы данных с помощью модели CakePHP, я использовал код $this->Model->deleteAll
для того же, и он отлично работает.
Теперь я хочу, чтобы в следующий раз, когда будут вставляться мои новые записи, они должны начинаться ID
только с 1, что не работает с функцией deleteAll
, поэтому есть ли синтаксис CakePHP по умолчанию, чтобы сделать таблицу усеченной ?
Дайте мне знать!
4 answers
ПРИМЕЧАНИЕ: Этот ответ действителен только до CakePHP 1.3. Я не использовал его в версиях never, поэтому понятия не имею, работает ли он.
deleteAll
только удаляет данные, но не усекает таблицу.
Вам нужно будет вызвать метод query()
.
$this->Model->query('TRUNCATE TABLE table_name_in_mysql;')
@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()
в определенных моделях, если они используют другой источник данных с другим синтаксис.
Вставьте всегда истинное условие, например
$this->Model->deleteAll('1=1');
Решение, не зависящее от драйвера базы данных для CakePHP 3:
Создайте AppTable.php
и сделайте так, чтобы все ваши таблицы расширяли эту.
Добавьте к нему эту функцию:
public function truncate()
{
$truncateCommands = $this->schema()->truncateSql($this->connection());
foreach ($truncateCommands as $truncateCommand) {
$this->connection()->query($truncateCommand);
}
}
Затем просто вызовите $table->truncate();
, и он должен обрезать таблицу независимо от того, какой драйвер базы данных вы используете.