Doctrine DBAL如果不存在则插入

时间:2015-09-09 10:33:18

标签: php mysql symfony doctrine-orm dbal

我正在使用带有Doctrine DBAL的Symfony2-framework,我将一些数据插入到MySql-database中。插入看起来像这样(简化):

$conn->insert('sometable', array(
        "col1"     => $data1,
        "col2"     => $data2,
        "col3"     => $data3
));

我想要实现的功能就像普通的sql-has一样。如果不存在则插入的能力,例如:INSERT IGNORE。但是有可能用DBAL做这样的事情吗?

请注意,我不会在这里使用对象。

编辑:请注意我没有使用对象,而是使用DBAL描述的数组插入方法。

Edit2:我尝试使用建议的try-catch来解决这个问题,除了一件事,它似乎运行得很好。即使没有添加新行,db auto也会增加主键。 这是我使用的代码:

    try{
        $conn->insert('sometable', array(
            "col1"     => $data1,
            "col2"     => $data2,
            "col3"     => $data3
       ));
   } catch( \Exception $e) {
          switch (get_class($e)) {
               case 'Doctrine\DBAL\DBALException':
                   // No problems here. Just means that the row already existed.
                   break;
               default:
                   $this->get('logger')->error("(ERROR in ".__METHOD__.", @Row: ".(__LINE__)."): DB-error! error: ".$e->getMessage());
                   break;
          }
  }

我还必须为表执行多行唯一索引,因为我必须检查所有列是否相同。即如果整行与我们试图插入的那一行相同。

所以......除非每次我们尝试insert-catch时自动增量值不断上升,否则它会正常工作。我不认为这是一个真正的问题,但浪费数字只是觉得愚蠢......:D

1 个答案:

答案 0 :(得分:2)

除了执行select查询并尝试检索行之外,我还没有意识到这样做的方法,即:

$sql = "SELECT * FROM sometable WHERE ....";
$stmt = $conn->prepare($sql);
$stmt->bindParam(); //or bindValue...
$stmt->execute();

$exists = $stmt->fetch();

if(!$exists) {
    // insert or whatever..
} else {
    // do nothing? 
}

最终你可能会附上Event,这会为你做到这一点,但我不确定这是否适用于你的情况。

或者,您可以创建唯一约束并在插入数据时执行try / catch。每当数据不唯一时,数据库就会返回一个错误,你通常会收到一个PDOException,虽然在Doctrine中我认为它的名称不同(检查exceptions)。只是catch该异常并且不做任何事情。例如:

try {
    $conn->insert('sometable', array(
        "col1"     => $data1,
        "col2"     => $data2,
        "col3"     => $data3
    ));
} catch(PDOException $e) {
   // do nothing. 
}