【问题标题】:ManyToOne as ID on doctrine (symfony2)ManyToOne 作为 ID 学说 (symfony2)
【发布时间】:2016-02-09 14:45:49
【问题描述】:

我正在使用 Symfony2 LTS 开发一个项目,需要为学说创建实体。在我的数据库模型中,我有一个 OneToMany 关系,它是 PK 的一部分。

Parent
+-------+--------------+-----+----------------+
| Field |     Type     | Key |     Extra      |
+-------+--------------+-----+----------------+
| id    | int(11)      | PRI | auto_increment |
| name  | varchar(255) |     |                |
+-------+--------------+-----+----------------+

MyChild
+--------------+---------+-----+----------------+
|    Field     |  Type   | Key |     Extra      |
+--------------+---------+-----+----------------+
| id           | int(11) | PRI | auto_increment |
| foreignId    | int(11) | PRI |                |
| other_fields | text    |     |                |
+--------------+---------+-----+----------------+

当我创建一个仅 ID 为 @ORM\Id 的 PHP 实体类时,没有问题,但是当我尝试将 ManyToOne 添加为 ID 时出现错误

[Doctrine\ORM\Mapping\MappingException]                                                 
  Single id is not allowed on composite primary key in entity MyBundle\Entity\MyChild

Php 类如下所示:

class MyChild
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var MyParent
 *
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="MyParent", inversedBy="childs")
 * @ORM\JoinColumn(name="foreignId", referencedColumnName="id")
 */
private $parent;

【问题讨论】:

  • MyChild 拥有复合主键是没有意义的。展示你是如何制作 foriegnId 的,或者看看一些 sql 基础知识。
  • 我想开始为每个父母增加孩子的 ID,所以我需要它作为主键。例如,父母 1 可以有孩子 1-1、1-2、...,父母 2 可以有 2-1、2-2、2-3
  • Child::id 作为 auto-inc 究竟如何工作?玩弄 id 几乎总是比它更值得的麻烦。如果 2-2 被删除会怎样?要重新编号吗?

标签: php symfony doctrine-orm doctrine


【解决方案1】:

您应该从 $parent 中删除 @ORM\Id 并为 $id 和 $parent 创建一个 UniqueConstraint。

/**
 * @ORM\Table(uniqueConstraints={
 *   @ORM\UniqueConstraint(
 *     columns={"id", "foreignId"}
 *   )
 * })))
 */
class MyChild
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var MyParent
 *
 * @ORM\ManyToOne(targetEntity="MyParent", inversedBy="childs")
 * @ORM\JoinColumn(name="foreignId", referencedColumnName="id")
 */
private $parent;

【讨论】:

  • 谢谢,这几乎是完美的。我可以告诉 $parent 不是 NULL 吗?
  • 很遗憾没有,但我可以在JoinColumn 上设置nullable
  • 所以你应该添加@ORM\JoinColumn(name="foreignId", referencedColumnName="id", nullable=false)
  • 很好的答案。是的,关联外键默认为NULL。您可以通过运行doctrine:schema:update --dump-sql 查看所有 SQL 查询
猜你喜欢
  • 2014-05-08
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多