Symfony 2.2 Doctrine2多对多关系插入查询

时间:2013-07-30 20:46:08

标签: php mysql symfony doctrine-orm doctrine

我在Symfony 2.2中使用Doctrine2。我有以下实体:

  1. “用户”
  2. “OrganizationSupplier”
  3. 和m:n这些实体之间的关系。这是模式中的方式:

    class User {
    .....
        /**
         * @ORM\ManyToMany(targetEntity="OrganizationSupplier", inversedBy="users")
         * @ORM\JoinTable(name="User_Supplier",
         *      inverseJoinColumns={@ORM\JoinColumn(name="organization_supplier_id", referencedColumnName="id")},
         *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
         *      )
         */
        private $allowed_suppliers;
    .....
    }
    

    class OrganizationSupplier
    {
    ...
        /**
         * @ORM\ManyToMany(targetEntity="User", mappedBy="allowed_suppliers")
         */
        private $users;
    ...
    }
    

    这是由Doctrine创建的m:n表:

    CREATE TABLE `User_Supplier` (
      `user_id` int(11) NOT NULL,
      `organization_supplier_id` int(11) NOT NULL,
      PRIMARY KEY (`user_id`,`organization_supplier_id`),
      KEY `IDX_31AFA1DDA76ED395` (`user_id`),
      KEY `IDX_31AFA1DD1A81C9F7` (`organization_supplier_id`),
      CONSTRAINT `FK_31AFA1DD1A81C9F7` FOREIGN KEY (`organization_supplier_id`) REFERENCES `organizationsupplier` (`id`),
      CONSTRAINT `FK_31AFA1DDA76ED395` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    

    以下是来自此m:n表的用户id = 638的数据:

    user_id organization_supplier_id
    638 618
    638 620
    638 622
    638 624
    638 626
    638 628
    638 630
    638 632
    638 634
    638 636
    

    到目前为止一切都很好。

    现在出现问题:我在admin中有一个表单,通过添加/删除记录来修改这个m:n表。从业务逻辑的角度来看,我需要从分配给组织的供应商列表中为某些用户分配/取消分配供应商(OrgaizationSupplier实体 - 见上文)

    以下是表单中此字段的代码:

    ->add('allowed_suppliers', 'entity', array('class'=>'STMainBundle:OrganizationSupplier', 'multiple'=>true, 'expanded'=>true,
            'query_builder' => function(EntityRepository $er) use ($user) {
                return $er->createQueryBuilder('os')
                    ->where('os.organization = :organization')
                    ->setParameter(':organization', $user->getOrganization());
    

    如果我在选中复选框的情况下提交它,我会收到SQL异常,它会尝试使用交换列启动查询:

    INSERT INTO User_Supplier (organization_supplier_id, user_id) VALUES (?, ?)' with params [638, 618]: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`sollod_new`.`user_supplier`, CONSTRAINT `FK_31AFA1DDA76ED395` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))".
    

    所以应该反过来,[618,638]而不是尝试[638,618]。

    我是symfony的新手,所以我试图找到它在postack上构建此查询的位置,以控制此参数顺序。

    有谁知道我能在哪里找到它?

    更新: Here是请求,用户实体和表单的瓢虫转储。这是在$ form-> bind($ request);

    之后完成的

    非常感谢

    更新:我的不好,我忘记了架构也被缓存了,我上面给出的架构已经是正确且固定的架构了:

     *      inverseJoinColumns={@ORM\JoinColumn(name="organization_supplier_id", referencedColumnName="id")},
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
    

    最初这些列已被交换。我只需要清除dev / prod缓存就可以了。抱歉,

1 个答案:

答案 0 :(得分:0)

这是一个缓存问题。最初数据模型是错误的,我把它修复为:

     *      inverseJoinColumns={@ORM\JoinColumn(name="organization_supplier_id", referencedColumnName="id")},
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}

忘了清除缓存