Мне не нравится использовать сеттеры, так как я не люблю мутировать объекты после их создания, поэтому вместо этого я использую стиль withFoo(Foo $foo)
, который возвращает клон:
public function withFoo(Foo $foo): self
{
$clone = clone $this;
$clone->foo = $foo;
return $clone;
}
Это очень долго служило мне, но теперь я должен работать с Doctrine2, и он не работает:
$foo = $fooRepository->getByBar($bar);
$foo = $foo->withBaz($baz);
$emi->flush();
Это приводит к ошибке в моих журналах примерно так:
app.ERROR: An exception occurred while executing 'INSERT INTO foo (id, bar, baz) VALUES (?, ?, ?)' with params ["51f74f6e-8e20-42ec-ba21-ac3ae62658ef", "Bar", "Baz"]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '51f74f6e-8e20-42ec-ba21-ac3ae62658ef' for key 'PRIMARY' [] []
Если я изменю свой код на следующий, он не будет обновляться без проблем:
public function withFoo(Foo $foo): self
{
$this->foo = $foo;
return $this;
}
На данный момент мне пришлось прибегнуть к использованию обычного установщика, но я неэто не нравитсяЕсть ли способ сделать это?
Я хочу сказать, чтобы сохранить обновление, но использовать идентификатор, чтобы определить, какую запись для обновления.Например, REPLACE INTO
в MySQL.
Любая помощь?