Symfony2 app / console不为实体关系/关联生成属性或模式更新

时间:2012-12-30 13:37:01

标签: symfony doctrine-orm

我正在阅读并遵循Symfony2中关于使用数据库和Doctrine(http://symfony.com/doc/2.0/book/doctrine.html)的书中的内容。我已经达到了“实体关系/关联”部分,但框架似乎没有做它本来要做的事情。我已将protected $ category字段添加到Product实体,并将$ products字段添加到Category实体。我的产品和类别实体如下:

产品:

<?php

namespace mydomain\mywebsiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=255)
     */
    private $description;

    /*
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;

    /**
     * Set description
     *
     * @param string $description
     * @return Product
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
}

分类

<?php

namespace mydomain\mywebsiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use \Doctrine\Common\Collections\ArrayCollection;

/**
 * Category
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="string", length=255)
     */
    private $description;

    /*
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    protected $products;

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

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

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}

根据文档,如果我现在执行

$ php app/console doctrine:generate:entities mydomain

框架应为Product中的新类别字段和Category中的新产品字段生成getters / setter。

HOWEVER 当我运行命令时,它应该更新实体,但它不会添加属性。我与备份(〜)文件进行了比较,没有区别。如果我添加另一个字段(例如description2)并为其添加doctrine注释以进行持久化,那么它会生成属性。我首先忽略了这一点并手动添加了映射字段的属性,然后执行:

$php app/console doctrine:schema:update --force

用于添加新的关联列。

再次告诉我,元数据和架构是最新的。

我删除了app / cache / dev文件夹并允许系统重新创建它,但它没有任何区别。

任何人都可以看到为什么框架的行为不像文档中描述的那样??

由于

5 个答案:

答案 0 :(得分:4)

你忘记了一颗星:

/*
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

一定是

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

答案 1 :(得分:1)

更新:尝试不同的事情后,绝对没有成功,我最终删除整个捆绑和相关的数据库,并从头开始。第二次正确生成事物并正确更新数据库模式。这种片状行为极其缺乏框架,正如上面评论中提到的那样,作为开发人员,我正在离开Grails。现在我发现symfony2有同样的问题。

当我使用框架时,我不应该总是在我的脑海里留意是否因为框架有问题而无法正常工作。这对于这样一个主流框架来说是非常不可接受的,似乎我不是唯一遇到过这种问题的人。框架开发人员应该通过(优选地)解决这些问题或者提供一些理解框架在随机情况下失败的方法来解决这些问题。

答案 2 :(得分:1)

基于我发现的问题是你不能有两种类型的定义......在本书中,实体为类别创建命令也会创建一个yml配置,因此注释失败。您必须使用注释或yml或xml或php。一旦我删除了yml配置并重新创建了带有注释的表,它就可以工作了......小心并且不要使用comnad进行类别创建..你仍然会得到一个错误,描述是必填字段:)

答案 3 :(得分:1)

我有完全相同的问题,我解决了这个问题: 删除包含yml文件的“doctrine”-Folder,其中包含实体的(在您的情况下为冗余!)配置。只在您的测试系统上进行此操作以用于教育目的。

一些背景信息(也许是比我更有经验的人 - 可能几乎每个人都在这里; o))可以添加到这个:

  • Doctrine优先于实体类中的注释使用YML-Schema配置(/ ** @ORM ... * /)
  • 在阅读本书时,你可能在第8章之前的几章中创建了一个带有YML-Schema配置的博客实体 - 也许你玩了一下这个YML-Schema与你的第8章练习在同一个包中
  • 因此:Doctrine认为您想要使用YML,但它只找到“anotherEntity”的配置,而不是产品和类别的配置
  • OR:你运行一些Doctrine命令进行测试并选择一次(错误?)YML和voilà:所有进一步的注释机会都会被忽略,因为即product.orm.yml存在

希望有所帮助。我刚开始第10章; - )

答案 4 :(得分:0)

当涉及到生成getter和setter时,Symfony只是使用ReflectionClass来查看方法是否已经存在。 它不会查看注释中写入的属性。

关于架构更新问题,我没有其他解决方案,然后重置数据库并从头开始创建它。 我几次遇到这个问题,但从未真正找到一个好的解决方案,似乎Symfony在某些属性之间没有差异,导致没有找到任何更新。

我现在手边没有框架,要查找它。也许您可以尝试找出什么架构:更新确实找到了错误。