Symfony学说 - 父母子女无法工作

时间:2015-11-05 12:37:38

标签: symfony doctrine-orm

我有一个表"节点",列id,parent_id等......

/**
 * Node
 *
 * @ORM\Table(name="nodes", indexes={@ORM\Index(name="parent", columns={"parent_id"}), @ORM\Index(name="path", columns={"path"})})
 * @ORM\Entity
 */
class Node
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="parent_id", type="integer", nullable=true)
     */
    private $parentId;

    ...
}

现在我想构建父子关系(parent_id是同一个表的id的外键)。基于关系的symfony cookbook示例(http://symfony.com/doc/current/book/doctrine.html#entity-relationships-associations),我尝试创建它:

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


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


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

我的第一个问题是,命令:

php app/console doctrine:generate:entities AppBundle

没有为父母和孩子创建getter和setter(没有错误消息,只是正常"生成..."消息)

所以我自己创造了吸气剂和制定者:

/**
 * @return mixed
 */
public function getParent() {
    return $this->parent;
}

/**
 * @param mixed $parent
 */
public function setParent( $parent ) {
    $this->parent = $parent;
}

/**
 * @return mixed
 */
public function getChildren() {
    return $this->children;
}

/**
 * @param mixed $children
 */
public function setChildren( $children ) {
    $this->children = $children;
}

但这似乎不起作用。我无法获取节点的父节点或子节点:

$node->getParent();
$node->getChildren();

两个命令都返回null,但数据是正确的。该代码甚至没有尝试查询父母或子女。

2 个答案:

答案 0 :(得分:0)

确保您的课程定义如下:

/**
 * @ORM\Entity()
 */
class Node
{
  public function __construct()
    {
        $this->children= new ArrayCollection();
    }

     /**
 * Set parent
 *
 * @param \Bundle\Entity\Node $parent
 * @return Message
 */
public function setParent(\Bundle\Entity\Node $parent = null)
{
    $this->parent = $parent;

    return $this;
}

/**
 * Get parent
 *
 * @return \Bundle\Entity\Node 
 */
public function getParent()
{
    return $this->parent;
}

/**
 * Add children
 *
 * @param \Bundle\Entity\Node $children
 * @return Message
 */
public function addReply(\Bundle\Entity\Node $children)
{
    $this->children[] = $children;

    return $this;
}

/**
 * Remove children
 *
 * @param \Bundle\Entity\Node $children
 */
public function removeReply(\Bundle\Entity\Node $children)
{
    $this->children->removeElement($children);
}

/**
 * Get children
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getChildren()
{
    return $this->children;
}
}

然后再次尝试实体生成命令。并且不要忘记更新架构。

答案 1 :(得分:0)

好的,我发现了为什么我有这个(愚蠢的)问题。由于我最初使用表(http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html)的逆向工程生成了我的实体,因此我在配置中使用了YML文件(自动生成的位置)。看来,如果你有这样的文件,symfony / doctrine会使用它们而不是注释。而已。我只是要删除它们。 捂脸