【问题标题】:Doctrine OneToOne incorrectly? generating a UNIQUE INDEX不正确的 OneToOne 教义?生成唯一索引
【发布时间】:2012-01-02 14:03:18
【问题描述】:

SchemaTool 正在为 OneToOne 的关联生成唯一索引。我相信这是不正确的。

Doctrine 的 Associations 手册页的第 6.6 节显示了 OneToOne 的示例,即产品有一个运输。这显示生成 Product 表:

CREATE TABLE Product (
    id INT AUTO_INCREMENT NOT NULL,
    shipping_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

但是,对于我的实体用户具有一个组织的相同代码,我的用户表 SQL 生成为

CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL,
    organisation_id INT DEFAULT NULL,
    UNIQ_3B978F9FA7F43455 (organisation_id),
    PRIMARY KEY(id)
) ENGINE = InnoDB;

这会阻止我添加 2 个具有相同组织的用户。不正确。

我还尝试使用唯一的 JoinColumn 注释参数来详细说明。

@JoinColumn(name="organisation_id", referencedColumnName="id", unique="false")

有什么想法吗?我似乎找不到任何关于此的信息。

谢谢

【问题讨论】:

  • 1-to-1 关系具有该功能...
  • 如果您希望组织中有很多用户,那么您需要1-to-many 关系。
  • 但是 Doctrine 的一对一示例是产品 OneToOne Shipping。如果这是一项功能,则意味着产品无法共享相同的运输方式,这似乎是错误的。许多产品应该可以使用运输选项。
  • 是的,那里似乎有错误。一对一关系应该是两个PRIMARY 键或PRIMARYUNIQUE 键或两个UNIQUE 键之间的引用。
  • @ypercube 是对的。我首先认为它们是指运输方式,但它可能意味着按订单列出的运输对象,例如发货日期、签收日期等。

标签: symfony doctrine-orm


【解决方案1】:

也许 YML 版本可以帮助其他人从学说/symfony 开始。这是我的版本:

User.orm.yml

manyToOne:
    organisation:
        targetEntity: Organisation
        joinColumn:
            name: organisation_id
            referencedColumnName: id

Organisation.orm.yml

oneToMany:
    users:
        targetEntity: User
        mappedBy: organisation
        joinColumn:
            name: organisation_id
            referencedColumn: id

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果一个组织有许多用户,而许多用户有一个且只有一个组织,则它不是一对一关联。

    一对一关联必须是唯一的。

    您的关联在用户端是 ManyToOne,在组织端是 OneToMany

    用户.php

    /**
     * @ManyToOne(targetEntity="Organisation")
     */
    private $organisation;
    

    组织.php

    use Doctrine\Common\Collections\ArrayCollection;
    
    /**
     * @OneToMany(targetEntity="User", mappedBy="organisation")
     */
    private $users;
    
    function __construct() {
        $this->users = new ArrayCollection();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2014-11-28
      • 2013-08-20
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多