我正在开发一个基于 Symfony 2
的 Web 应用程序,并努力在实体之间创建多对多关系:
每个Task
实体应分配给任意数量的Categories
。当然,每个Category
可以由任意数量的Task
实体使用。虽然Task
需要知道其Categories
,但Category
类与Tasks
没有任何关系。
已关注 this tutorial我创建了:
class Task {
/**
* @ORM\Column(name="categories")
* @ORM\ManyToMany(targetEntity="MyBundle\Entity\Category")
*/
protected $categories;
public function __construct() {
$this->productVariations = new \Doctrine\Common\Collections\ArrayCollection();
...
}
}
这会产生以下 SQL 表:
CREATE TABLE task ... categories VARCHAR(255) NOT NULL, ...
使用具有以下类型的表单创建新的任务
:
class TaskType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('categories', EntityType::class, array(
'class' => 'MyBundle:Category',
'choice_label' => 'name',
'multiple' => true,
'expanded' => true,
))
...
}
}
提交表单并将新的Task
实例保留在 SQL 行中,categories
列中包含以下内容:
Doctrine\Common\Collections\ArrayCollection@000000007448a17a0000000048941f2f
这是什么意思?将引用的Category
实体存储为数组不是正常形式,但当然有效(事实上,我更喜欢这个解决方案而不是添加关系表因为实际上每个任务的类别数量会非常小,因此第三个表的开销会更大)。
但是我假设数组以某种形式存储引用的对象/行的 ID。如何在 VARCHAR(255)
列中存储任意数量的引用?
提交和保存创建数据库条目时,Category
引用未正确存储。当我尝试重新读取此条目时,categories
属性为空。
最佳答案
您有多余的列定义。尝试简单地删除以下行:
* @ORM\Column(name="categories")
然后您需要更新数据库架构。
此行在任务表中创建了一个不应该存在的 varchar
字段。多对多关系是通过单独的表实现的。
如果您想将 id 存储在单个字段而不是单独的表中,那么您将自行处理。那是因为它不再能够成为一种关系。您失去了创建外键或执行任何连接查询的可能性。此外,过滤记录将更难实现。
关于php - 如何在 Symfony2 中使用多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44106600/