学说一到一,在不同的表上有两个条件


Doctrine OneToOne with 2 conditions on different tables

我正在一个遗留系统上工作,我正试图慢慢地使其与更现代的实践同步。

我正试图实现原则ORM和映射一些现有的数据库表。不幸的是,在这一点上改变DB结构是不可行的,所以我必须使用我所拥有的。

DB结构如下:

foo:

  • id
  • 标题

栏:

  • id
  • foo_id
  • baz_id

巴兹

  • id
  • foo_id
  • bar_id
  • column_value_i_want

所以每个Foo都有多个Bar项。这个关系很简单,并按预期工作。问题是,在Baz.foo_id = Foo.id AND Baz.bar_id = Bar.id)

条件下,对于每个Bar项,应该有1个Baz项。

我搜索了一下,找不到映射这个的方法。这在教条主义中可能吗?

 class Foo
 {
     /**
     * @Id @GeneratedValue @Column(type="integer")
     */
    private $id;
    /**
     * @OneToMany(targetEntity="Bar", mappedBy="foo")
     */
     private $bar;
 }

class Bar
 {
     /**
     * @Id @GeneratedValue @Column(type="integer")
     */
    private $id;
    /**
     * @ManyToOne(targetEntity="Foo", inversedBy="bar")
     * @JoinColumn(name="foo_id", referencedColumnName="id")
     */
    private $foo;
    //how do I get a single Baz here where (Baz.foo_id = this Foo.id AND Baz.bar_id = Bar.id)?
 }   

class Baz
 {
     /**
     * @Id @GeneratedValue @Column(type="integer")
     */
    private $id;
    //?
    private $foo_id;
    //?
    private $bar_id;
 }

您必须使用查询生成器对bar的结果强制执行此限制。

    $qry = $this->entManager->getRepository("Entities'Bar")->createQueryBuilder("Bar");
    $qry->Join("Entities'Baz", "Baz", "WITH", "Baz.id = Bar.id");
    $qry->where(Bar.foo is not null and  Baz.bar_id = Bar.id);

我希望这能帮到你