gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:15:42 25 4
gpt4 key购买 nike

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

  1. “用户”
  2. “组织供应商”

和 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

到目前为止一切都很好。

现在的问题是:我在管理中有一个表单,它通过添加/删除其中的记录来修改此 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 缓存就可以让它工作。对此感到抱歉

最佳答案

这是缓存的问题。最初数据模型是错误的,我将其修复为:

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

忘了清除缓存

关于php - Symfony 2.2 Doctrine2 多对多关系插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com