我有一组要保存到数据库的项目,但我希望只有在不存在时才插入记录。
我认为最有效的方法是在保存之前过滤集合。Doctrine 可以自动完成吗?
还是我应该获取集合中所有项目的所有 id,然后在数据库中查询这些 id 列表中不存在的项目,然后在 foreach 中删除所有我们不需要的集合项目,最后保存集合?
有什么更好的方法建议吗?
我有一组要保存到数据库的项目,但我希望只有在不存在时才插入记录。
我认为最有效的方法是在保存之前过滤集合。Doctrine 可以自动完成吗?
还是我应该获取集合中所有项目的所有 id,然后在数据库中查询这些 id 列表中不存在的项目,然后在 foreach 中删除所有我们不需要的集合项目,最后保存集合?
有什么更好的方法建议吗?
这是 Doctrine_Collection 类的保存函数
public function save(Doctrine_Connection $conn = null, $processDiff = true)
{
if ($conn == null) {
$conn = $this->_table->getConnection();
}
try {
$conn->beginInternalTransaction();
$conn->transaction->addCollection($this);
if ($processDiff) {
$this->processDiff();
}
foreach ($this->getData() as $key => $record) {
$record->save($conn);
}
$conn->commit();
} catch (Exception $e) {
$conn->rollback();
throw $e;
}
return $this;
}
我不确定您从哪里获取您的收藏,或者您是否手动构建它,但您可能想尝试扩展 Doctrine_Collection 类并像这样重载保存函数
<?php
class My_Collection extends Doctrine Collection
{
public function save(Doctrine_Connection $conn = null, $processDiff = true, $createOnly = true)
{
if ($conn == null) {
$conn = $this->_table->getConnection();
}
try {
$conn->beginInternalTransaction();
$conn->transaction->addCollection($this);
if ($processDiff) {
$this->processDiff();
}
foreach ($this->getData() as $key => $record) {
if($createOnly)
{
if ($record->exists())
{
$record->save($conn);
}
}else{
$record->save($conn);
}
}
$conn->commit();
} catch (Exception $e) {
$conn->rollback();
throw $e;
}
return $this;
}
}
我对 Doctrine 一无所知,但 MySQL REPLACE查询正是您想要的 - 如果没有找到主键匹配项,则更新现有行并创建新行。