我有2个实体 - NewsItem
和Category
。它是这些实体之间的单向关联:1 NewsItem
有1 Category
,1 Category
有很多NewsItem
。
我正在尝试创建像THIS示例中的关联映射。我尝试过什么?我的代码:
class NewsItem {
// other fields
/**
* @var int
* @ORM\Column(type="integer")
* @ORM\ManyToOne(targetEntity="News\Entity\Category")
*/
protected $category_id;
// other fiels, getters, setters etc
}
之后,我手动删除了数据库中的表,并在命令行中运行命令orm:schema-tool:update --force
。它说一些查询没有错误地执行 - 它没问题。但是当我在HeidiSQL中打开表Category
时,那里没有FOREIGN KEYS。这意味着表没有链接。
我做错了什么?
您可以在此处观看此News\Entity\NewsItem
实体的完整代码:click me。 News\Entity\Category
实体位于此处:click me。
答案 0 :(得分:1)
你应该删除* @ORM\Column(type="integer")
,因为它与多对一关系冲突。
即使不是错误的原因,您也应该将protected $category_id;
重命名为protected $category;
此外,您的两个实体位于相同的命名空间下,因此无需添加相关实体的完整路径。 targetEntity="Category"
就够了。
答案 1 :(得分:1)
您有类别实体的映射信息不正确。
您的 NewsItem.php 文件应如下所示:
namespace Your\Bundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinColumn;
/**
* @ORM\Table(name="news_item")
* @ORM\Entity
*/
class NewsItem {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Category
*
* @ORM\ManyToOne(targetEntity="Category", inversedBy="news_items")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
private $category;
// Rest of code omitted.
}
您的 Category.php 应如下所示:
namespace Your\Bundle\Entity;
/**
* @ORM\Table(name="category")
* @ORM\Entity
*/
class Category {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="NewsItem", mappedBy="category")
*/
private $news_items;
public function __construct(){
$this->news_items = new ArrayCollection();
}
// Rest of code omitted.
}