【问题标题】:Doctrine: Many-To-Many Relationship with ID教义:与 ID 的多对多关系
【发布时间】:2017-02-07 13:40:55
【问题描述】:

是否有可能在 Doctrine 2 多对多 关系中没有 有来自连接表的 复合键,而是有一个 ID 列。

A_B​​strong>

ID
A_ID
B_ID

当前问题是它按升序对 插入的 ids 进行排序,但我需要它们按照从表单中添加的顺序

谢谢

【问题讨论】:

  • 当人们想按主键排序时总是有点可疑。无论如何,如果默认行为不适合,则创建您自己的连接实体并与其他两个实体建立多对一关系。但坦率地说,如果实体的排序很重要,那么添加您自己的排序列。
  • 我建议为此添加一个自动时间戳列,并使用时间戳对结果进行排序。

标签: php mysql symfony doctrine-orm


【解决方案1】:

多对多关系并不意味着有序。如果您想订购一些东西,您将向连接表引入额外的数据,并且它不再是连接表而是一个单独的实体。因此,为了对关系进行排序,您必须定义“连接实体”并为两个表设置多对一关系,如下所示:

Table A            Table AB            Table B
ID                 A_ID                ID
                   B_ID
                   order

AB 表与 A 和 B 具有多对一关系。

【讨论】:

    【解决方案2】:

    是的,有可能

    Table A            Table AB           Table B
    ID                 ID
                       A_ID                ID
                       B_ID
                       order
    

    在你应该定义的实体中:

    /**
    * @ORM\ManyToMany(targetEntity="\YourNameSpace\Model\Entities\B",fetch="EXTRA_LAZY")
    * @ORM\JoinTable(
    *      name="AB",
    *      joinColumns={
    *          @ORM\JoinColumn(name="B_ID", referencedColumnName="A_ID")
    *      },
    *      inverseJoinColumns={
    *          @ORM\JoinColumn(name="B_ID", referencedColumnName="ID")
    *      }
    *)
    */
    protected $B;
    

    在 B 实体中:

    /**
    * @ORM\ManyToOne(targetEntity="\YourNameSpace\Model\Entities\A", inversedBy="AB", fetch="EXTRA_LAZY")
    * @ORM\JoinColumns({
    *   @ORM\JoinColumn(name="A_ID", referencedColumnName="ID")
    * })
    */
    protected $A;
    

    但如果您的主要问题只是排序,您可以将创建的字段添加到表中并按它排序。

    ->orderBy('AB.created', 'DESC')
    

    【讨论】:

    • 在某些时候您可能应该尝试您的建议。我怀疑你会意识到 Doctrine ManyToMany 关系不能有额外的属性。相应地投了反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2012-09-15
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多