Doctrine OneToOne在不同的表上有2个条件

时间:2016-06-29 18:54:23

标签: php orm doctrine-orm

我正在研究一个遗留系统,我正在尝试慢慢地更新现代实践。

我正在尝试实现Doctrine ORM并映射一些现有的数据库表。不幸的是,此时更改数据库结构是不可行的,所以我必须使用我所拥有的。

这是数据库结构:

FOO:

  • ID
  • 标题

栏:

  • ID
  • foo_id
  • baz_id

巴兹

  • ID
  • foo_id
  • bar_id
  • column_value_i_want

因此每个Foo都有多个Bar项。这种关系很简单,并且按预期工作。问题是每个Bar个项目,Baz

条件下应该有1个Baz.foo_id = Foo.id AND Baz.bar_id = Bar.id)

我搜索了一下,找不到映射方法。是否可以使用Doctrine?

 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;
 }

1 个答案:

答案 0 :(得分:0)

您必须使用查询构建器强制对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);

我希望这可以提供帮助。