orm icon indicating copy to clipboard operation
orm copied to clipboard

[ORM v1] ORM постоянно пытается обновить date/datetime поля

Open roquie opened this issue 4 years ago • 1 comments

  1. Сделать выборку записей, у которых есть поле с датой. Например, дата рождения (без времени) и дата создания записи. Причем выборку можно делать как через связь (BelongsTo) так и напрямую из репозитория, без разницы.
  2. Затем попробовать изменить любые другие побочные сущности и запустить транзакцию. ОРМ считает, что надо всегда обновлять поля с датами.
  3. В консоли включить максимальный verbose.

Пример кода:


class Bar 
{
  #[Cycle\Relation\HasMany(target: Foo::class)]
  private Collection $foos;
  
  public function __construct()
  {
      $this->foos = new ArrayCollection();
  }
  
  public function getFoos(): Collection
  {
      return $this->foos;
  }
}

class Foo 
{
  #[Cycle\Relation\BelongsTo(target: Post::class)]
  private Post $post;

  public function setPost(Post $post): void
  {
      $this->post = $post;;
  }
}

$user = $userRepository->findByPK($id);
$posts = $user->getPosts(); // `created_at`, `birthday` или `published_at`. Не суть, главное, что поле не меняется и не в маппере

$bar = new Bar();
$bar->setAcme('Value')

foreach($posts as $post) {
  $foo = new Foo();
  $foo->setPost($post); 
  $foo->setSomething(1);

  $bar->getFoos()->add($bar); // getFoos() это Doctrine Collection.
}

$this->transaction->persist($bar);
$this->transaction->run();

P.S. created_at создан через маппер, а birthday обычным способом. Он обновляет оба поля, то есть это не проблема в мапперах (которые 1-в-1 скопированы из документации).

Версия 1.8.0, PHP 8.1

roquie avatar Dec 06 '21 06:12 roquie

в БД эти поля именно как Date, а не Datetime? В сущности это объект DatetimeInterface?

roxblnfk avatar Dec 11 '21 13:12 roxblnfk