首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2应用程序/控制台不为实体关系/关联生成属性或模式更新

Symfony2应用程序/控制台不为实体关系/关联生成属性或模式更新
EN

Stack Overflow用户
提问于 2012-12-30 13:37:00
回答 4查看 3.8K关注 0票数 2

我正在阅读和遵循在Symfony2关于使用数据库和理论(http://symfony.com/doc/2.0/book/doctrine.html)的书中所写的代码。我已经到达了“实体关系/协会”部分,但是框架似乎并没有做它想要做的事情。我已经将受保护的$category字段添加到产品实体中,并将$products字段添加到类别实体中。我的产品和类别实体如下:

产品:

代码语言:javascript
复制
<?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;
    }
}

类别:

代码语言:javascript
复制
<?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;
    }
}

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

代码语言:javascript
复制
$ php app/console doctrine:generate:entities mydomain

框架应该为products中的新类别字段和类别中的新products字段生成getter/setters。

但是,,当我运行命令时,它应该更新实体,但是它不添加属性。我已经和备份(~)文件做了比较,没有什么区别。如果我添加另一个字段(例如description2),并向其添加持久化的原则注释,那么它将生成属性。我首先忽略了这一点,手动添加了映射字段的属性,然后执行:

代码语言:javascript
复制
$php app/console doctrine:schema:update --force

来添加新的关联列。

然而,再次告诉我,元数据和模式是最新的。

我已经删除了app/cache/dev文件夹,并允许系统重新创建它,但是没有什么不同。

有人能看到为什么框架没有像文档中所描述的那样运行吗?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2013-01-17 09:32:31

你在这里忘记了一颗星:

代码语言:javascript
复制
/*
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;

它一定是

代码语言:javascript
复制
/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
protected $category;
票数 4
EN

Stack Overflow用户

发布于 2012-12-30 15:27:21

更新:在尝试了不同的事情但没有成功之后,我最终删除了整个包和相关的数据库,然后从头开始。第二次正确生成事物,并正确更新数据库模式。这种古怪的行为在框架中是非常糟糕的,正如上面的评论所提到的那样,作为一个开发人员,我正在远离Grails。现在我发现symfony2也有同样的问题。

当我使用一个框架时,我不应该总是把它放在我的脑海中,因为这个框架是错误的。对于这样一个主流框架来说,这是相当不可接受的,而且似乎我不是唯一遇到这种问题的人。框架开发人员肯定应该通过(最好)解决这些问题,或者提供一些方法来理解框架在随机情况下失败的原因。

票数 1
EN

Stack Overflow用户

发布于 2014-04-21 09:44:04

根据我所发现的,问题是您不能有两种类型的definitions..in,即还创建了一个yml,因此注释失败了。您必须使用注释或yml、xml或php。一旦我删除了yml并重新创建了带有注释的表,worked..be就会小心地使用comnad,而且createion..you类别也不会使用comnad,尽管会得到一个错误,说明说明是必需的:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14091153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档