2013-07-31 2 views
1

Пример модели:Упорно сериализованный объект в Учении

/** @Entity */ 
class Person{ 
    /** 
    * @Id @Column(type="integer", nullable=false) 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** @Column */ 
    protected $name; 

    /** @Column(type="datetime") */ 
    protected $created_at; 

    //setters and getters... 

    public function __construct($std){ 
     $this->id = $std->id; 
     $this->nome = $std->nome; 
     $this->created_at = new DateTime; 
    } 
} 

Я использую JSON общаются между клиентом/сервером. мне нужно, чтобы получить JSON от клиента

{ "id": 123, "name": "john" } 

и сохраняются, сохраняя поле «created_at» без изменений. Делать так:

$p = json_decode($string); 
$person = new Person($p); 
entity_manager->merge($person); 
entity_manager->flush(); 

В этом случае объект обновляется успешно, но, очевидно, поле «created_at» устанавливается новое значение от «нового DateTime». я мог бы получить управляемый объект из БД, а затем просто изменить «имя», но я не хочу ненужную Select ..

В двух словах, как я могу выполнить что-то вроде этого:

UPDATE Person set name = "john" where id = 123 

Есть ли аннотация, чтобы игнорировать свойство при обновлении? Есть ли способ установить свойство без изменений?

EDIT

После нескольких испытаний с использованием SqlLogger, я понял, что метод слияния() выполняет оператор SELECT, чтобы получить текущее состояние ... Итак, мое решение, сейчас, чтобы получить сам объект и замените только те значения, которые я хочу обновить. Что-то вроде:

$std = json_decode($string); 
$p = entity_manager->find('Person', $std->id); 
$p->name = $std->name; 
entity_managet->flush(); 

Таким образом, число «выбирает» одно и то же, но я получаю, чтобы сохранить исходные значения из атрибутов, которые я не получаю от JSON.

ответ

0

Доктрина нуждается в постоянном объекте, чтобы иметь возможность определять, какое поле было обновлено или нет.

http://apigen.juzna.cz/doc/doctrine/doctrine2.git/source-class-Doctrine.ORM.UnitOfWork.html#607-623

Если ваш вопрос только о DateTime, вы можете использовать «ColumnDefinition» часть «в колонке» аннотаций для обработки вашего значения create_at.

http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html#annref-column

Например с MySQL:

/** @Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") */ 
protected $created_at; 

//setters and getters... 

public function __construct($std){ 
    $this->id = $std->id; 
    $this->nome = $std->nome; 
    //And so remove this initialization 
    //$this->created_at = new DateTime; 
} 
+0

Проблема с использованием определения столбца является то, что флаг CURRENT_TIMESTAMP ограничивается только один столбец в таблице ... вы не можете использовать его для автоматически установите созданную временную метку и последнюю обновленную временную метку. – nelsonec87

+0

Я принял из-за очевидного 1-го предложения: «Учение нуждается в постоянном сущности ...». Это привело меня к большему количеству тестов и выяснило, что merge() также выполняет выбор в БД. – nelsonec87

Смежные вопросы