【问题标题】:Argument 1 passed to App\Entity\Invitacion::setEmail() must be an instance of App\Entity\User or null - Symfony 4传递给 App\Entity\Invitacion::setEmail() 的参数 1 必须是 App\Entity\User 的实例或 null - Symfony 4
【发布时间】:2025-12-29 15:10:11
【问题描述】:

我是 Symfony4 的新手。我有一个与表中设置的值有关的问题。我一直在关注 Symfony 文档。我想将用户的 emailcodeinvitations 变量存储在邀请表中,但它给了我一个错误。

请帮我解决我的问题。

这些是我的实体

应用/实体/User.php


class User implements UserInterface, \Serializable
{
    (...)

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @ORM\OneToMany(targetEntity="App\Entity\Invitacion", mappedBy="user")
     */
    private $email;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @ORM\OneToMany(targetEntity="App\Entity\Invitacion", mappedBy="user")
     */
    private $codeinvitaciones;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Invitacion", mappedBy="user")
     */
    private $invitaciones;

    /**
     * User constructor
     */
    public function __construct()
    {
        $this->invitaciones = new ArrayCollection();
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getCodeinvitaciones(): ?string
    {
        return $this->codeinvitaciones;
    }

    public function setCodeinvitaciones(string $codeinvitaciones): self
    {
        $this->codeinvitaciones = $codeinvitaciones;

        return $this;
    }

    /**
     * @return Collection|Invitacion[]
     */
    public function getInvitaciones(): Collection
    {
        return $this->invitaciones;
    }

    public function addInvitaciones(Invitacion $invitacion): self
    {
        if (!$this->invitaciones->contains($invitacion)) {
            $this->invitaciones[] = $invitacion;
            $invitacion->setCodeinvitaciones($this);
        }

        return $this;
    }

}

应用/实体/Invitacion.php


class Invitacion
{
    (...)

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="email")
     * @ORM\JoinColumn(nullable=false)
     */
    private $email;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="invitaciones")
     * @ORM\JoinColumn(nullable=false)
     */
    private $codeinvitaciones;


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

    public function getEmail(): ?User
    {
        return $this->email;
    }

    public function setEmail(?User $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getCodeinvitaciones(): ?User
    {
        return $this->codeinvitaciones;
    }

    public function setCodeinvitaciones(User $codeinvitaciones): self
    {
        $this->codeinvitaciones = $codeinvitaciones;

        return $this;
    }

}


在控制器中,我在表单中注册时创建用户。同时,我将 email 和变量 codeinvitations 存储在 invitation 表中,但它给了我一个错误。

控制器

(...)
$invitacion->setEmail($email);
$invitacion->setCodeinvitaciones($registroInv);

错误

Argument 1 passed to App\Entity\Invitacion::setEmail() must be an instance of App\Entity\User or null,
string given, called in C:\Users\adria\Documents\app\bebeBB\src\Controller\UserController.php on line 38

谢谢

-------------编辑-----------

我已经尝试过传递Invitacion::setEmail(?string),但它给出了这个错误:

Expected value of type "App\Entity\User" for association field
"App\Entity\Invitacion#$codeinvitaciones", got "string" instead.

【问题讨论】:

  • 错误是不言自明的,setEmail 需要一个 User 实例(或 null),你正在传递一个字符串。大概(因为您的控制器代码丢失)您正在执行$email = $user->getEmail();。将Invitacion::setEmail(?User) 更改为Invitacion::setEmail(?string) 及其映射或传递整个User 对象。
  • 我已经尝试过传递Invitacion::setEmail(?string),但它给出了这个错误:Expected value of type "App\Entity\User" for association field "App\Entity\Invitacion#$codeinvitaciones", got "string" instead.
  • 是的,已经指出了这一点。 Invitacion 实体中的 $email mapping 类型为 User: @ManyToOne(targetEntity="App\Entity\User")。如果您想要用户表的外键,则必须传递 User 对象并相应地调整所有调用。如果您不需要引用并且可以使用非规范化数据,请将其更改为 string

标签: symfony doctrine-orm doctrine symfony4


【解决方案1】:

正如在 cmets setEmail(?User email) 中已经说过的,将 null 或 User-object 作为输入。我怀疑你会想在那里输入电子邮件地址,所以你可以这样做:

二传手:

setEmail(?string $email)

呼叫:

$user = new User();
$user->setEmail('test@test.com');
$invitacion->setEmail($user->getEmail());

或者如果您真的想按原样添加完整的用户对象:

$user = new User();
$user->setEmail('test@test.com');
$invitacion->setEmail($user);

在这两种情况下,它们都必须首先是用户对象。然后你可以为你的 setter 访问对象或邮件。

【讨论】:

    最近更新 更多