我正在阅读和遵循在Symfony2关于使用数据库和理论(http://symfony.com/doc/2.0/book/doctrine.html)的书中所写的代码。我已经到达了“实体关系/协会”部分,但是框架似乎并没有做它想要做的事情。我已经将受保护的$category字段添加到产品实体中,并将$products字段添加到类别实体中。我的产品和类别实体如下:
产品:
<?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框架应该为products中的新类别字段和类别中的新products字段生成getter/setters。
但是,,,当我运行命令时,它应该更新实体,但是它不添加属性。我已经和备份(~)文件做了比较,没有什么区别。如果我添加另一个字段(例如description2),并向其添加持久化的原则注释,那么它将生成属性。我首先忽略了这一点,手动添加了映射字段的属性,然后执行:
$php app/console doctrine:schema:update --force来添加新的关联列。
然而,,再次告诉我,元数据和模式是最新的。
我已经删除了app/cache/dev文件夹,并允许系统重新创建它,但是没有什么不同。
有人能看到为什么框架没有像文档中所描述的那样运行吗?
谢谢
发布于 2013-01-17 09:32:31
你在这里忘记了一颗星:
/*
* @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;发布于 2012-12-30 15:27:21
更新:在尝试了不同的事情但没有成功之后,我最终删除了整个包和相关的数据库,然后从头开始。第二次正确生成事物,并正确更新数据库模式。这种古怪的行为在框架中是非常糟糕的,正如上面的评论所提到的那样,作为一个开发人员,我正在远离Grails。现在我发现symfony2也有同样的问题。
当我使用一个框架时,我不应该总是把它放在我的脑海中,因为这个框架是错误的。对于这样一个主流框架来说,这是相当不可接受的,而且似乎我不是唯一遇到这种问题的人。框架开发人员肯定应该通过(最好)解决这些问题,或者提供一些方法来理解框架在随机情况下失败的原因。
发布于 2014-04-21 09:44:04
根据我所发现的,问题是您不能有两种类型的definitions..in,即还创建了一个yml,因此注释失败了。您必须使用注释或yml、xml或php。一旦我删除了yml并重新创建了带有注释的表,worked..be就会小心地使用comnad,而且createion..you类别也不会使用comnad,尽管会得到一个错误,说明说明是必需的:)
https://stackoverflow.com/questions/14091153
复制相似问题