2014-09-04 54 views
2

我有一个表,其中一个字段为唯一并且在其中有一些记录。我需要插入一些新的记录(一些记录可能已经存在于表中),而不会使查询失败。在Zend Framework中忽略重复使用INSERT IGNORE 2

In plain MySQL;我可以写使用忽略关键字作为INSERT忽略该查询...

如何指定INSERT忽略Zend框架2 DB

回答

0

你仍然可以做,在普通的MySQL如果你喜欢。

$ sql =“INSERT ...”;这样

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

$adapter = $this->tableGateway->getAdapter(); 

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

感谢@ dixromos98。目前我正在使用查询方法。 ZF2中是否有本地方法来执行INSERT IGNORE查询? – 2014-09-09 09:59:26

+0

你可以修改INSERT查询的答案吗?由于问题是关于INSERT查询的;其他人查看答案会更好。 – 2014-09-09 10:08:48

+1

我看了一下,但似乎不支持插入忽略。正如我在教程中看到的那样,正在使用的逻辑解决方案是检查是否存在主键,然后对该行执行更新。那就是如果你不想要简单查询 – dixromos98 2014-09-09 12:41:50

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; 
5

我使用这个:

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); 
+0

Bingo。这只是工作。 – 2016-02-07 02:36:15