在Zend Framework 2中使用INSERT IGNORE忽略重复项

时间:2014-09-04 08:02:09

标签: zend-framework2

我有一个表格,其中一个字段是唯一并且其中包含一些记录。我需要插入一些新记录(表中可能已存在某些记录),而不会使查询失败。

简单 MySQL ;我可以使用 IGNORE 关键字将查询编写为 INSERT IGNORE ...

如何在 Zend Framework 2 数据库

中指定 INSERT IGNORE

3 个答案:

答案 0 :(得分:6)

我用这个:

use Zend\Db\Sql\Insert;

class InsertIgnore extends Insert
{
    /**
     * @var array Specification array
     */
    protected $specifications = [
        self::SPECIFICATION_INSERT => 'INSERT IGNORE INTO %1$s (%2$s) VALUES (%3$s)',
        self::SPECIFICATION_SELECT => 'INSERT IGNORE INTO %1$s %2$s %3$s',
    ];
}

实践中

//$action = $sql->insert(); // Before
$action = new InsertIgnore($sql->getTable()); // After
$action->values($data);

答案 1 :(得分:1)

如果您使用\Zend\Db\Sql\Insert,则可以创建扩展类并覆盖getSqlString(...)


\src\MyNamespace\Zend\Db\Sql\Insert.php

<?php

namespace MyNamespace\Zend\Db\Sql;

class Insert extends \Zend\Db\Sql\Insert {
    /**
     * @var bool
     */
    public $ignore = false;

    public function getSqlString(\Zend\Db\Adapter\Platform\PlatformInterface $adapterPlatform = null) {
        if ($this->ignore !== true) {
            return parent::getSqlString($adapterPlatform);
        }
        return preg_replace('/^INSERT/', 'INSERT IGNORE', parent::getSqlString($adapterPlatform), 1);
    }
}

用法:

$insert = new \MyNamespace\Zend\Db\Sql\Insert();
$insert->ignore = true;

答案 2 :(得分:0)

如果你愿意的话,你仍然可以在普通的MySQL中做到这一点。

  

$ sql =“INSERT ...”;

如果您使用tablegateway或定义适配器documentation

,请获取此类适配器
$adapter = $this->tableGateway->getAdapter();

$resultset = $adapter->query($sql,array());
$rowData= $resultset->getAffectedRows();