教义 2 中与单个实体的父子关系

我有如下所示的数据库表:

<前>+----+--------+-----+|身份证 |家长 |说明 |+----+--------+-----+|1 |空|猫 1 ||2 |1 |P Cat 1 的孩子 1 ||3 |1 |P Cat 1 的孩子 2 ||4 |空|猫 2 ||5 |4 |P Cat 2 的孩子 1 ||6 |4 |P Cat 2 的孩子 2 |+----+--------+-----+

如何创建具有这些列的学说 2 实体,但我需要父列将id"列作为父列引用.当然,父记录有一个空的父"列值.

我觉得很公平

id;}/*** 将另一个类别 ID 设置为该类别的父级.*/公共函数 setParent(Category $category){$this->parent = $category;}/*** 清除父 ID 并使其为空.*/公共函数 clearParent(){$this->parent = null;}/*** 设置描述.** @param 字符串 $description* @return 类别*/公共函数 setDescription($description){$this->description = $description;返回 $this;}/*** 获取描述值.** @return 字符串*/公共函数 getDescription(){返回 $this->description;}}

不用说,这似乎不起作用.问题是:

  1. 将另一个实体添加为父实体时,setParent() 方法似乎无法按预期工作.
  2. 我需要在该实体上使用 getChildren() 方法.我怎样才能做到这一点?

解决方案

这应该有效:

children = new ArrayCollection();}//一旦你有了它,访问父级和子级应该是直接的//(在本示例中,一旦您尝试访问它们,它们就会被延迟加载).IE:公共函数 getParent() {返回 $this->parent;}公共函数 getChildren() {返回 $this->children;}//...//总是使用它来建立一个新的父/子关系公共函数 addChild(Category $child) {$this->children[] = $child;$child->setParent($this);}公共函数 setParent(Category $parent) {$this->parent = $parent;}}

I have database table that looks like this:

+----+--------+--------------------+
| id | parent | description        |
+----+--------+--------------------+
|  1 | null   | P Cat 1            |
|  2 | 1      | Child 1 of P Cat 1 |
|  3 | 1      | Child 2 of P Cat 1 |
|  4 | null   | P Cat 2            |
|  5 | 4      | Child 1 of P Cat 2 |
|  6 | 4      | Child 2 of P Cat 2 |
+----+--------+--------------------+

How can I create a doctrine 2 entity that has these columns, but I need the parent column to reference the "id" column as a parent. Of course, a parent record has a null "parent" column value.

So fair I have

<?php
namespace MyNamespace;
use DoctrineORMMapping AS ORM;
use DoctrineCommonCollectionsArrayCollection;
/**
 * @ORMEntity
 * @ORMTable(name="category")
 **/
class Category
{
    /**
     * @ORMId
     * @ORMColumn(type="integer", name="id")
     * @ORMGeneratedValue
     */
    protected $id;

    /**
     * Creates a parent / child relationship on this entity.
     *
     * @ORMManyToOne(targetEntity="MyNamespaceCategory",inversedBy="id")
     * @ORMJoinColumn(name="FK_parent_id", referencedColumnName="id", nullable=true)
     */
    protected $parent = null;

    /**
     * @ORMColumn(type="string", name="description", length=250)
     *
     * @var string
     */
    protected $description;

    /**
     * Gets the Primary key value.
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Sets another category ID as the parent of this category.
     */
    public function setParent(Category $category)
    {
        $this->parent = $category;
    }

    /**
     * Clears the parent id and makes it null.
     */
    public function clearParent()
    {
        $this->parent = null;
    }

    /**
     * Sets the description.
     *
     * @param string $description
     * @return Category
     */
    public function setDescription($description)
    {
        $this->description = $description;
        return $this;
    }

    /**
     * Gets the description value.
     *
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }
}

Needless to say, this doesn't appear to work. The questions are:

  1. The setParent() method doesn't appear to work as expected when another entity is added as a parent.
  2. I need a getChildren() method on this entity. How can I achieve that?

解决方案

This should work:

<?php

use DoctrineCommonCollectionsArrayCollection;

/** @ORMEntity */
class Category {

    /**
     * @ORMId
     * @ORMColumn(type="integer", name="id")
     * @ORMGeneratedValue
     */
    protected $id;

    // ...

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

    /**
     * @ORMManyToOne(targetEntity="Category", inversedBy="children")
     * @ORMJoinColumn(name="parent", referencedColumnName="id")
     */
    protected $parent;

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

    // Once you have that, accessing the parent and children should be straight forward 
    // (they will be lazy-loaded in this example as soon as you try to access them). IE:

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

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

    // ...

    // always use this to setup a new parent/child relationship
    public function addChild(Category $child) {
       $this->children[] = $child;
       $child->setParent($this);
    }

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

}

相关文章