Php 条令:类用户的对象无法转换为字符串

Php 条令:类用户的对象无法转换为字符串,php,doctrine-orm,entity-relationship,Php,Doctrine Orm,Entity Relationship,我在条令上不断犯下这样的错误: PHP Catchable fatal error: Object of class User could not be converted to string in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 1337 在我的系统中,用户可以在一对多关系中拥有多个权限。我已经设置了用户和权限实体。它们看起来是这样的(为了减少混乱,我删除了一些注释、getter和setter): 当我

我在条令上不断犯下这样的错误:

PHP Catchable fatal error:  Object of class User could not be converted to string in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 1337
在我的系统中,用户可以在一对多关系中拥有多个权限。我已经设置了
用户
权限
实体。它们看起来是这样的(为了减少混乱,我删除了一些注释、getter和setter):

当我向
用户添加新的
权限
时,会出现此问题:

$permission = new Permission();

$user->getPermissions()->add( $permission );

$em->persist( $user );
$em->flush();
这是我的堆栈跟踪的最后一点:

PHP  11. Doctrine\ORM\UnitOfWork->persist() vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:565
PHP  12. Doctrine\ORM\UnitOfWork->doPersist() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1555
PHP  13. Doctrine\ORM\UnitOfWork->cascadePersist() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1615
PHP  14. Doctrine\ORM\UnitOfWork->doPersist() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2169
PHP  15. Doctrine\ORM\UnitOfWork->persistNew() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1597
PHP  16. Doctrine\ORM\UnitOfWork->scheduleForInsert() doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:836
PHP  17. Doctrine\ORM\UnitOfWork->addToIdentityMap() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1157
PHP  18. implode() vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1337

任何洞察都将不胜感激。

我认为权限实体中的用户属性映射存在问题。试试这个:

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="permissions")
 * @JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

您是否正在初始化OneToMany侧的集合? 还有,要从集合中添加和删除的方法

class User {
   /**
    * @ORM\OneToMany(targetEntity="Permission", mappedBy="user", cascade={"persist"})
    */
   protected $permissions;

   public function getPermissions()
   {
      return $this->permissions;
   }

    public function __construct()
    {
        $this->permissions = new \Doctrine\Common\Collections\ArrayCollection();
    }



    public function addPermissions (Permission $permissions)
    {
        $this->permissions[] = $permissions;

            return $this;
     }


     public function removePermissions(Permission $permissions)
     {
        $this->permissions->removeElement($permissions);
      }

       //...

嗯。我让它工作了

我还没有完全弄清楚原因,但当我将以下内容添加到我的
用户
实体时,它就起作用了:

class User {    

   public function __toString()
   {
      return strval( $this->getId() );
   }

}

如果我发现更多,我会在这里发布。

你的解决方案给了我一个正在发生的事情的线索

即使你有实体和膏体,教义也无法理解实体之间的关系。当条令理解实体之间的关系时,它知道调用什么方法(即User::getId()),但在其他情况下,它会尝试将您发送的任何内容转换为标量值,以用于查询数据库。这就是为什么它调用用户的_toString函数,这就是为什么如果您在toString中返回id,一切都会从这里开始

这是可以的,但它是一个补丁,如果我们能找到更好的解决方案,您可能不想保留它,因为随着应用程序的增长,它可能更难维护

我能看到的是,在您拥有的权限中:

/**
* @ORM\Column(name="user_id", type="integer")
* @ORM\ManyToOne(targetEntity="User", inversedBy="permissions")
*/
 protected $user;
您应该删除
@ORM\列(type=“integer”

关于连接列,这不是强制性的,但是您必须确保defaut是您想要的。正如我们所看到的

在详细介绍所有关联映射之前,您应该 请注意,@JoinColumn和@JoinTable定义通常是 可选,并具有合理的默认值。联接的默认值 一对一/多对一关联中的列如下所示:

因此,它应该在
权限
表中查找一列
user\u id
,并将其与
user
表中的
id
列连接起来。我们认为这是可以的

如果这是真的,那么在您的用户中,id不应该是用户id,而是id:

 /**
    * @ORM\Column(name="id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
   protected $id;
或者,如果列名实际上是user\u id,那么user类是可以的,但是您必须将join列更改为@ORM\JoinColumn(name=“user\u id”,referencedColumnName=“user\u id”)


我能说的就这么多。我无法尝试,但如果您能给我一秒钟,我会很高兴的。

只是检查一下,您是否记得运行
原则:模式:更新
?:)添加方法代码是什么?@IgorPantović:不幸的是,我不能这样做。我正在把条令应用到一个已经存在的数据库中。很抱歉,应该提到这一点。@shad:
add
方法来自Doctrine的
ArrayCollection
,即
getPermissions()
返回一个
ArrayCollection
。我已经用我的持久化代码更新了我的问题..我尝试了这个。清除我的缓存后,除我之外的所有人都会收到完全相同的错误。请检查两个实体上的getter,以查看是否返回了对象而不是变量,例如
return$this
而不是
返回$this->id我已将我的getter和setter添加到问题中。我看不出他们有什么问题……嗨。是,我的
$权限
是用
数组集合
初始化的。不确定实体上的
add
remove
方法是如何产生这个问题的。实际上,我唯一关心的是构造函数。其他方法可能很方便,但我喜欢这样做,因为我喜欢实体具有一致的接口,而不依赖于其数据类型的实现。另外,我知道的是,若你们通过逆向工程从数据库中创建你们的实体,用条令工具,那个么这些方法就被创建了,我不知道这是否意味着一些水合者希望他们在那个里。不用担心。我明白了。
name: "<fieldname>_id"
referencedColumnName: "id"
/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="permissions", cascade={"persist"})
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
  protected $user;
 /**
    * @ORM\Column(name="id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
   protected $id;