【问题标题】:How to Truncate Table using CakePHP?如何使用 CakePHP 截断表?
【发布时间】:2011-08-23 20:16:49
【问题描述】:

我想用 CakePHP 模型截断我的数据库表,我使用了 $this->Model->deleteAll 代码,它工作正常。

现在,我想要的是,下次插入新记录时,它应该以 1 开头ID,这不适用于deleteAll 函数,所以是否有任何默认的 CakePHP 语法来制作表 截断 ?

告诉我!

【问题讨论】:

  • 可以通过:$this->Model->query('TRUNCATE TABLE table_name');实现

标签: mysql cakephp truncate


【解决方案1】:

注意:此答案仅在 CakePHP 1.3 之前有效。我没有在 never 版本上使用它,所以我不知道它是否有效。

deleteAll 只删除数据,不截断表格。

您需要调用query() 方法。

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

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

【讨论】:

  • 只有一个警告——它是特定于 mysql 的,并不是在我们可以截断的所有 DBMS 中。 It was officially introduced in the SQL:2008 standard.
  • 不应该是$this->Model->query('TRUNCATE table tablename;')
  • @trante,我按照你的方式尝试,但查询无法执行。我该怎么办?
  • @DoNhuVy 这个答案已经有好几年了,我很长时间没有和 Cake 一起工作了。很抱歉,开发新 CakePHP 的人需要参与进来。
  • 它确实适用于带有 CakePHP 2.X 的 Mysql “tablename”应该是 mysql 表上的名称,而不是别名,也不是模型名称。
【解决方案2】:

CakePHP 3 的与数据库驱动程序无关的解决方案:

创建一个AppTable.php,并让你的所有表都扩展这个。

给它添加这个函数:

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

然后只需调用$table->truncate();,无论您使用哪个数据库驱动程序,它都会截断表。

【讨论】:

    【解决方案3】:

    @JohnP's 不考虑在database.php 中配置的表前缀。这是一种更强大的方法。

    附加到每个模型的 DboSource 对象已经有一个 fullTableName() 方法,它可以满足我们的需要。

    首先,create 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 应用中为 any 模型获取完整的表名,包括前缀:

    $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 查询以匹配不同的数据源,您可以在应用的中心位置执行此操作。如果特定模型使用具有不同语法的不同 DataSource,您还可以轻松覆盖 truncate() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2012-03-30
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多