Doctrine:类的对象User无法转换为字符串

时间:2014-01-06 02:17:28

标签: php doctrine-orm entity-relationship

我一直在使用Doctrine获取此错误:

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

在我的系统中,用户可以在一对多关系中拥有许多权限。我已经设置了UserPermission实体。它们看起来像这样(我删除了一些注释,getter和setter以减少混乱):

class User {

   /**
    * @ORM\Column(name="user_id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
   protected $id;

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

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

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

}

class Permission {

   /**
    * @ORM\Column(name="user_id", type="integer")
    * @ORM\ManyToOne(targetEntity="User", inversedBy="permissions")
    */
   protected $user;

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

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

      return $this;
   }
}

当我向Permission添加新的User时出现问题:

$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

非常感谢任何见解。

4 个答案:

答案 0 :(得分:9)

行。我已经开始工作了。

我还没有完全弄清楚原因,但当我将以下内容添加到我的User实体时,它可以正常工作:

class User {    

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

}

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

答案 1 :(得分:7)

你的解决方案让我知道发生了什么。

即使你有实体和anotations,Doctrine也无法理解实体之间的关系。当学说理解实体之间的关系时,它知道要调用哪些方法(即User :: getId()),否则,它会尝试将您发送的任何内容转换为可用于查询数据库的标量值。这就是为什么它调用User的__toString函数,这就是为什么如果你在toString中返回id,一切都可以在这里工作。

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

我能看到的是,你有权限:

/**
* @ORM\Column(name="user_id", type="integer")
* @ORM\ManyToOne(targetEntity="User", inversedBy="permissions")
*/
 protected $user;

您应该删除@ORM\Column(type="integer"

关于连接列,它不是必需的,但你必须确保你想要的是defauts。我们可以阅读here

  

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

name: "<fieldname>_id"
referencedColumnName: "id"

所以,它们与显式相同:

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

因此,它应该在user_id表中查找列Permissions,并将其与id表的User列连接。我们认为这没问题。

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

 /**
    * @ORM\Column(name="id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
   protected $id;

或者如果列名实际上是user_id,那么User类就可以了,但您必须将join列更改为@ORM \ JoinColumn(name =“user_id”,referencedColumnName =“user_id”)

我可以这么说。我不能尝试知道,但如果你能给它一点,我会很高兴。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

你正在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);
      }

       //...