我正在一个遗留系统上工作,我正试图慢慢地使其与更现代的实践同步。
我正试图实现原则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);
我希望这能帮到你