Doctrine DBAL 如果不存在则插入
Doctrine DBAL Insert if doesn't exist
我正在使用带有 Doctrine DBAL 的 Symfony2 框架,并且正在将一些数据插入 MySql 数据库。插入看起来像这样(简化):
$conn->insert('sometable', array(
"col1" => $data1,
"col2" => $data2,
"col3" => $data3
));
我想实现的是像普通 sql- 那样的功能。如果不存在则插入的能力,例如: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;
}
}
而且我还必须为 table 做一个多行唯一索引,因为我必须检查所有列是否都相同。即如果整行与我们要插入的行相同。
所以..除此之外它工作得很好,除了每次我们尝试插入捕获时自动增量值不断上升。我不认为这是一个真正的问题,但浪费数字感觉很愚蠢..:D
除了执行 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。只要数据不是唯一的,数据库就会 return 一个错误,你通常会收到一个 PDOException
尽管在 Doctrine 中我认为它有不同的名称(检查 exceptions)。只是 catch
那个例外,什么也不做。示例:
try {
$conn->insert('sometable', array(
"col1" => $data1,
"col2" => $data2,
"col3" => $data3
));
} catch(PDOException $e) {
// do nothing.
}
我正在使用带有 Doctrine DBAL 的 Symfony2 框架,并且正在将一些数据插入 MySql 数据库。插入看起来像这样(简化):
$conn->insert('sometable', array(
"col1" => $data1,
"col2" => $data2,
"col3" => $data3
));
我想实现的是像普通 sql- 那样的功能。如果不存在则插入的能力,例如: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;
}
}
而且我还必须为 table 做一个多行唯一索引,因为我必须检查所有列是否都相同。即如果整行与我们要插入的行相同。
所以..除此之外它工作得很好,除了每次我们尝试插入捕获时自动增量值不断上升。我不认为这是一个真正的问题,但浪费数字感觉很愚蠢..:D
除了执行 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。只要数据不是唯一的,数据库就会 return 一个错误,你通常会收到一个 PDOException
尽管在 Doctrine 中我认为它有不同的名称(检查 exceptions)。只是 catch
那个例外,什么也不做。示例:
try {
$conn->insert('sometable', array(
"col1" => $data1,
"col2" => $data2,
"col3" => $data3
));
} catch(PDOException $e) {
// do nothing.
}