Доктрина - лучший способ проверить запись, затем либо обновить, либо добавить - PullRequest
4 голосов
/ 12 июня 2010

Я несколько раз сталкивался с этим сценарием, работая над текущим проектом.Я должен увидеть, существует ли запись, тогда, если это не так, мне нужно добавить ее, если она есть, то мне нужно обновить.Каков стандартный способ сделать это с Doctrine?

Мне кажется, что я пытаюсь выяснить, существует ли запись, используя метод find *.Затем, если это возвращает положительный результат (объект), я использую этот объект для обновления.В противном случае (запись не найдена) я должен создать еще один объект и сохранить ().

По какой-то причине это просто кажется неэффективным.Есть ли лучший способ или я просто странный?:)

$user = Doctrine_Core::getTable('Model_User')->findOneByEmail('myemail@email.com');
if (!$user) {
    $user = new Model_User();
    $user->fromArray($values); // $values comes from form or wherever
    $user->save();
} else {
    $user->fromArray($values);
    $user->save();
}

Ответы [ 2 ]

4 голосов
/ 12 июня 2010

Кажется, вы просто немного многословны :) Я думаю, это довольно "чисто":

$user = Doctrine_Core::getTable('Model_User')->findOneByEmail('myemail@email.com');
if (!$user) {
    $user = new Model_User();
}
$user->fromArray($values); // $values comes from form or wherever
$user->save();

Вы могли бы свернутьсобственный:

class Model_UserTable extends Doctrine_Table {
    ...

    public findOrCreateOneByEmail($email) {
        $user = $this->findOneByEmail($email);
        if (is_null($user)) {
            $user = new Model_User();
            $user->email = $email;
        }

        return $user;
    }
}
1 голос
/ 22 декабря 2011

Я написал свой собственный метод в необходимом классе sfDoctrineRecord.

public function saveOrUpdate(Doctrine_Connection $conn = null) {
    $object = Doctrine_Core::getTable('TableAlias')->find(array($this->getKey1(), $this->getKey2()));
    if (!is_object($object)) {
        $object = $this;
    }else{
        $object->setVar1($this->getVar1());
        $object->setVar2($this->getVar2());
        $object->setVar3($this->getVar3());
        $object->setVar4($this->getVar4());
    }
    $object->save();
}
...