@OneToOne和@JoinColumn产生类型的期望值...异常

时间:2019-04-29 18:38:16

标签: php symfony doctrine-orm symfony4

当我按照@OneToOne@JoinColumn的Doctrine文档创建两个ORM实体类,然后尝试刷新持久化操作时,出现以下错误:

  

关联字段“ App \ Entity \ LoginObject#$ username”的类型为“ App \ Entity \ UserObject”的预期值,改为使用“字符串”。

我尝试传递带有用户名的字符串,并传递用户对象的ORM实体对象实例,该实例会产生一个错误,表明登录对象需要一个字符串。无论哪种方式,我都无法做到这一点。 UserObject保存用户记录。 LoginObject保存登录事件时间戳,用户名是用户表中的外键。

// UserObject.php:
class UserObject
...
    /**
     * @ORM\Column(type="text", unique=true)
     */
    private $username;

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }
...
// LoginObject.php:
   /**
     * @ORM\OneToOne(targetEntity="UserObject")
     * @ORM\JoinColumn(name="username", referencedColumnName="username")
     */
    private $username;

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }

我的预期结果是希望将登录对象作为新条目插入数据库中,但是事实并非如此,任何建议都会有所帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

根据事物的外观,您不太了解the documentation。我建议您再读一遍,但是要慢一些;)将它与以下内容进行比较:

class User {
    // make this the primary key (@ORM\ID)
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Login", mappedBy="user")
     */
    private $login;

    public function getLogin(): ?Login
    {
        return $this->login;
    }

    public function setLogin(Login $login): self
    {
        $this->login = $login;

        return $this;
    }

    // ...
}
class Login {
    // make this the primary key (@ORM\ID)
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="User", inversedBy="login")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\Column(type="string", nullable=false, unique=true)
     */
    private $username;

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(User $user): self
    {
        $this->user = $user;

        return $this;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }

    // extra
    public function __invoke(): string
    {
        return $this->getUsername();
    }

    // ...
}

答案 1 :(得分:0)

IIRC,您需要在LoginObject中将$ username设置为UserObject的实例,而不是字符串。
检出this page in the Symfony docs