Doctrine:如何仅保存DB中不存在的集合项

时间:2010-01-19 09:48:25

标签: php doctrine doctrine-1.2

我有一组要保存到数据库的项目,但我希望只在不存在的情况下插入记录。

我认为最有效的方法是在保存之前过滤集合。 Doctrtrine可以自动完成吗?

或者我应该获取集合中所有项目的所有id,然后在数据库中查询这些id列表中不存在的项目,然后在foreach中删除我们不需要的所有集合项目,最后保存集合?

建议采用哪种更好的方法?

2 个答案:

答案 0 :(得分:2)

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

}

答案 1 :(得分:0)

我对Doctrine一无所知,但MySQL REPLACE 查询正是你想要的 - 更新现有的行&amp;如果未找到主键匹配,则创建新行。