【问题标题】:Doctrine self referencing entity relationship throws error教义自引用实体关系引发错误
【发布时间】:2014-01-28 08:02:32
【问题描述】:

我在 Doctrine 中有一个自引用实体,但是当我尝试持久化它们时,我不断收到以下错误:

PHP Catchable fatal error:  Object of class Category could not be converted to string in vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php on line 165

例子:

$category1 = new Category();
$category1->setName("Foo");
$category1->setParent( NULL );

$category2 = new Category();
$category2->setName("Bar");
$category2->setParent( $category1 );

$manager->persist( $category1 );
$manager->persist( $category2 );

$manager->flush();

我的实体如下所示:

/**
 * @ORM\Table(name="categories")
 * @ORM\Entity
 */
class Category {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=64, unique=true)
     */
    protected $name;

    /**
     * @ORM\Column(nullable=true)
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     */
    protected $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     */
    protected $children;

    public function __construct()
    {
        $this->children = new ArrayCollection();
    }

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

    public function getName()
    {
        return $this->name;
    }

    public function setName( $name )
    {
        $this->name = $name;

        return $this;
    }

    public function getParent()
    {
        return $this->parent;
    }

    public function setParent( Category $parent = NULL )
    {
        $this->parent = $parent;

        return $this;
    }

    public function getChildren()
    {
        return $this->children;
    }

    public function setChildren( ArrayCollection $children )
    {
        $this->children = $children;

        return $this;
    }

}

我在 Google 上搜索并将我的代码与其他示例进行了比较,但我似乎无法发现问题所在。我显然忽略了一些东西,但是什么?

【问题讨论】:

    标签: doctrine-orm entity-relationship self-reference


    【解决方案1】:

    尝试使用

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
     */
    protected $parent;
    

    但我也建议您在父列上设置 onDelete="SET NULL",如下所示:

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
     */
    public $parent;
    

    我知道这不是问题的一部分,但您可能会在不久的将来需要它。如果您希望 children 列以用户可以选择的顺序为您提供类别,您可能需要添加一个名为 order 的整数列并定义 children 像这样:

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"order" = "ASC"})
     */
    public $children;
    

    【讨论】:

    • 如果这对您有帮助,请给我 +1(我的答案左侧的向上箭头)。谢谢
    • 谢谢。这似乎有效。您能否解释一下为什么我的版本不起作用?尽管我的语法有点不同,但我想了解错误的来源。如果可以的话,我会为类别建议投票两次。 :)
    • 你好。我认为唯一的错误是语法(您将可空值放在 column 注释中)。
    猜你喜欢
    • 2015-08-08
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多