我有一個保存到數據庫的項目集合,但我希望只有在不存在記錄的情況下才能插入記錄。學說:如何只保存數據庫中不存在的收集項目
我認爲最有效的方法是在保存之前過濾集合。教條可以自動執行嗎?
或者我應該得到集合中所有項目的所有id,然後在數據庫中查詢這些id列表中不存在的項目,然後在foreach中刪除我們不需要的所有集合項目,最後保存採集?
有什麼更好的方法建議?
我有一個保存到數據庫的項目集合,但我希望只有在不存在記錄的情況下才能插入記錄。學說:如何只保存數據庫中不存在的收集項目
我認爲最有效的方法是在保存之前過濾集合。教條可以自動執行嗎?
或者我應該得到集合中所有項目的所有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;
}
}
我不知道什麼學說,但MySQL的更換查詢你想要做正是 - 更新現有行&如果沒有找到主鍵的比賽創造了新的行。
謝謝。但我不想更新現有的行。如果存在,就不要做任何事情。另外,我正在使用PostgreSQL。 – takeshin 2010-01-29 08:41:20
在Doctrine中,您可以使用replace()方法,但此方法刪除現有記錄,然後插入新的。 這意味着該行的ID不會被保留。 – takeshin 2010-03-17 00:11:16
更合適的MYSQL操作將是INSERT IGNORE,而不是REPLACE。但它看起來像PostgreSQL不支持這些。 – Sam 2010-07-13 22:46:44