2

我正在阅读并遵循 Symfony2 关于使用数据库和 Doctrine 的书 ( http://symfony.com/doc/2.0/book/doctrine.html ) 中所写的代码。我已经到达“实体关系/关联”部分,但该框架似乎并没有做它应该做的事情。我已将受保护的 $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 中的新类别字段和类别中的新产品字段生成 getter/setter。

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

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

为其添加新的关联列。

但是它再次告诉我元数据和模式是最新的。

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

谁能看到为什么框架的行为不像文档中描述的那样?

谢谢

4

5 回答 5

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;
于 2013-01-17T09:32:31.320 回答
1

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

当我使用一个框架时,我不应该总是在脑海中记住是否有什么东西不工作,因为框架是错误的。对于这样一个主流框架来说,这是非常不可接受的,而且似乎我并不是唯一遇到此类问题的人。框架开发人员绝对应该通过(最好)解决这些问题或提供一些方法来理解框架在随机情况下失败的原因。

于 2012-12-30T15:27:21.540 回答
1

我遇到了完全相同的问题,我像这样解决了它:删除包含 yml 文件的“doctrine”-文件夹以及实体的(在您的情况下是多余的!)配置。仅出于教育目的在您的测试系统上执行此操作。

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

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

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

于 2014-10-27T17:30:03.137 回答
1

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

于 2014-04-21T09:44:04.870 回答
0

在生成 getter 和 setter 时,Symfony 只是使用 ReflectionClass 来查看方法是否已经存在。它不看注释中写了哪些属性。

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

我现在没有手头的框架来查找它。也许您可以尝试找出 schema:update 的确切作用,从而找到错误。

于 2012-12-30T14:17:21.890 回答