php - 如何在 Symfony2 中使用多对多关系

标签 php mysql forms symfony

我正在开发一个基于 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/

相关文章:

php - 异步加载数据会加快页面加载速度吗?

javascript - 从 https 相对路径链接到非 https 页面

mysql - 具有三个where条件的select查询很慢,但是具有三个where条件中的任意两个条件的相同查询很快

javascript - 使用 AJAX 通过 POST 请求发送 HTML 表单多个 <select> 框?

php - 没有收到来 self 的 php 表单的电子邮件

php - 如何管理 PHP 项目开发生命周期?

php - 选择 MYSQL 行,但行成列,列成行

mysql - 在 MySQL 的存储过程中编写可选参数?

mysql - 统计SQL中每个父元素下每个子元素的评分

javascript - 单击按钮查找两个数字中的最大值