migrations icon indicating copy to clipboard operation
migrations copied to clipboard

Generates nullable columns incorrectly for HasMany relation

Open roquie opened this issue 4 years ago • 2 comments

PHP version: 8.0 Package version: v1.0.10

How to reproduce:

  1. User entity:
<?php

declare(strict_types=1);

namespace App\Database;

use App\Database\Typecast\Uuid;
use App\Exception;
use App\Repository;
use App\Database\Column;
use Cycle\Annotated\Annotation as Cycle;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;

#[Cycle\Entity(
    repository: Repository\User::class
)]
class User
{
    use Column\Id;

    #[Cycle\Column(type: 'string(64)')]
    public string $username;

    #[Cycle\Relation\HasMany(target: Comment::class)]
    private Collection $comments;

    public function __construct(Uuid $id, string $username, string $password)
    {
        $this->id = $id;
        $this->username = $username;
        $this->comments = new ArrayCollection();
    }

    public function getComments(): Collection
    {
        return $this->comments;
    }
}
  1. Comment entity
<?php

declare(strict_types=1);

namespace App\Database;

use App\Repository;
use App\Database\Column;
use Cycle\Annotated\Annotation as Cycle;

#[Cycle\Entity(
    repository: Repository\Comment::class
)]
class AuthCode
{
    use Column\Id;

    #[Cycle\Relation\BelongsTo(target: User::class, nullable: true)]
    private ?User $user = null;

    #[Cycle\Column(type: 'string')]
    private string $text;

    public function setUser(?User $user): void
    {
        $this->user = $user;
    }

    public function setText(string $value): void
    {
        $this->text = $value;
    }

    public function getText(): string
    {
        return $this->text;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }
}
  1. php app.php cycle:migrate -r

Results: Screenshot 2021-08-06 at 11 30 17

P.S. Column Id Trait:

<?php
declare(strict_types=1);

namespace App\Database\Column;

use Cycle\Annotated\Annotation as Cycle;
use App\Database\Typecast\Uuid;

trait Id
{
    #[Cycle\Column(type: 'uuid', typecast: Uuid::class, primary: true)]
    private ?Uuid $id = null;

    public function getId(): ?Uuid
    {
        return $this->id;
    }
}

Results expected as nullable: true.

roquie avatar Aug 06 '21 08:08 roquie

probably this is the same problem as I faced in this issue https://github.com/cycle/orm/issues/120

vvval avatar Aug 06 '21 09:08 vvval

Try to add nullable to comments relation

#[Cycle\Relation\HasMany(target: Comment::class, nullable: true)]
private Collection $comments;

butschster avatar Aug 17 '21 07:08 butschster