【问题标题】:Doctrine and composite unique keys教义和复合唯一键
【发布时间】:2012-09-20 10:31:08
【问题描述】:

我想在学说中做复合唯一键。 这些是我的领域:

/**
 * @var string $videoDimension
 *
 * @Column(name="video_dimension", type="string", nullable=false)
 */
private $videoDimension;

/**
 * @var string $videoBitrate
 *
 * @Column(name="video_bitrate", type="string", nullable=false)
 */
private $videoBitrate;

我如何证明那些组合在一起是复合唯一键的学说?

【问题讨论】:

    标签: php mysql doctrine-orm


    【解决方案1】:

    回答问题:

    use Doctrine\ORM\Mapping\UniqueConstraint;
    
    /**
     * Common\Model\Entity\VideoSettings
     *
     * @Table(name="video_settings", 
     *    uniqueConstraints={
     *        @UniqueConstraint(name="video_unique", 
     *            columns={"video_dimension", "video_bitrate"})
     *    }
     * )
     * @Entity
     */
    

    @UniqueConstraint

    【讨论】:

    • 感谢您的信息~作为说明,如果您解决了自己的问题,虽然您不能立即接受,但通常接受您自己的答案是一种很好的形式,这样如果人们正在搜索,它显示为有可接受的答案。
    • 是否可以使用-ToOne 关联(外键)来做到这一点?
    • 我知道这是旧帖子,但@Dimitry K 是可能的。只是你需要在@ORM\JoinColumn(name="join_table_id", referencedColumnName="id", nullable=false) 中使用列名。这是“join_table_id”。
    • 请注意,您必须提供 名称,而不是字段名称。因此,您必须将 camelCase 转换为 snake_case 并附加 _id 以进行关联,因为这就是 Doctrine 生成列名的方式。
    • 名称是自动生成的@Table(uniqueConstraints={@UniqueConstraint(columns={"case_id", "duration"})}),其他都无所谓
    【解决方案2】:

    我发现 use 仅 ORM 更冗长,然后在注释中添加 ORM 前缀。另请注意,您可以将注释分成几行以使其更具可读性,尤其是当您要提及多个项目时(下例中的索引)。

    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * VideoSettings
     *
     * @ORM\Cache(usage="NONSTRICT_READ_WRITE")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\VideoSettingsRepository")
     * @ORM\Table(name="emails", uniqueConstraints={
     *      @ORM\UniqueConstraint(name="dimension_bitrate", columns={"video_dimension", "video_bitrate"})
     * }, indexes={
     *      @ORM\Index(name="name", columns={"name"})
     * })
     */
    class VideoSettings
    

    【讨论】:

      【解决方案3】:

      如果有人想使用 PHP 8 属性 而不是 Doctrine 注释:

      use Doctrine\ORM\Mapping as ORM;
      
      #[ORM\Entity]
      #[ORM\UniqueConstraint(
        name: 'video_unique_idx',
        columns: ['video_dimension', 'video_bitrate']
      )]
      

      【讨论】:

        【解决方案4】:

        我知道这是一个老问题,但我在寻找创建复合 PK 的方法时遇到了它,并认为它可以使用一些更新。

        如果您需要的是复合主键,事情实际上要简单得多。 (当然,这保证了唯一性)Doctrine 文档包含一些很好的例子,通过这个 url:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

        所以原始示例可能如下所示:

        /**
         * @var string $videoDimension
         *
         * @ORM\Id @ORM\Column(type="string")
         */
        private $videoDimension;
        
        /**
         * @var string $videoBitrate
         *
         * @ORM\Id @ORM\Column(type="string")
         */
        private $videoBitrate;
        

        这里有几点说明:

        1. “名称”列被省略,因为 Doctrine 可以根据 属性名称
        2. 由于videoDimensionvideoBitrate 都是PK 的一部分 - 无需指定nullable = false
        3. 如果需要 - Composite PK 可能由外键组成,因此请随意添加一些关系映射

        【讨论】:

        • 您所做的是复合主键。当然它会是唯一的,但它是一个主键...... ;)
        • 嗯,是的,我想我已经在回答中提到了这一点:) 实际上,如果他不是要创建 PK,那么“唯一索引”一词在 OP 的情况下会更合适(这就是接受的答案确实如此)。但是由于这个问题包含一个奇怪的术语“复合唯一键”——我不明白为什么我们不能假设它是一个复合主键——至少这是我遇到这个问题时一直在寻找的。干杯!
        【解决方案5】:

        XML 版本:

        <unique-constraints>
            <unique-constraint columns="column1,column2" name="give_some_explicit_name" />
        </unique-constraints>
        

        文档中的更多详细信息:
        https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/xml-mapping.html#defining-indexes-or-unique-constraints

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-19
          • 1970-01-01
          相关资源
          最近更新 更多