php - Doctrine DBAL 如果不存在则插入

标签 php mysql symfony doctrine-orm dbal

我将 Symfony2 框架与 Doctrine DBAL 结合使用,并将一些数据插入 MySql 数据库。插入看起来像这样(简化):

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

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

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

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

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

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

而且我还必须为表做一个多行唯一索引,因为我必须检查是否所有列都相同。即,如果整行与我们要插入的行相同。

所以.. 它在其他方面工作得很好,除了每次我们 try-insert-catch 时自动增量值不断上升。我不认为这是一个真正的问题,但浪费数字感觉很愚蠢..:D

最佳答案

除了执行选择查询并尝试检索行之外,我不知道有什么方法可以做到这一点,即:

$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. 
}

关于php - Doctrine DBAL 如果不存在则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477202/

相关文章:

php - Joomla 管理登录自定义错误

php - 向mysql表中插入数据表格

php - 三元 foreach 嵌套在 if/else 中

mysql - 查询转换 Varchar HH :MM to Integer Minutes in MySQL

php - Symfony:动态更改数据库

php - 表单提交上的成功/错误消息未显示

php - 如何使用特定值连接两个 mysql 表?

MySQL - 根据另一列计算一列的不同值

php - Symfony2 - 更改现有用户的编码器

symfony - Goutte Scrape 登录到 https 安全网站