我的数据库关系看起来像这样:
booking -> person <-> option
-> : one-to-many
<-> : many-to-many
我现在需要列出预订中的所有人,以及他们的所有选择。在kohana中使用ORM我可以加载所有这样的人:
$persons = ORM::factory('booking', $id)->persons->find_all();
然后我可以遍历这些人并获得他们所有的选择,但这意味着每人一个查询。是否有一种聪明的方法来加载它而不必这样做?我想最终得到的是这样的:
booking
└ id
└ created
└ persons
└ 0
└ id
└ name
└ options
└ 0
└ id
└ price
└ n
└ id
└ price
└ n
└ id
└ name
└ options
└ 0
└ id
└ price
└ n
└ id
└ price
我可能不得不为此编写一个自定义数据库查询,但即使这样,我也不太清楚如何做到这一点。我的SQL-fu不是最好的:p
答案 0 :(得分:0)
如果您正在使用ORM,则根本不需要编写任何SQL。
您会发现本指南很有用。
http://www.scribd.com/doc/5022685/Kohana-PHP-ORM-Guide-Volume-1- 我认为这是针对Kohana第2版的ORM,但我不认为它有太大的不同。您的里程可能会有所不同。
请注意,ORM需要非常具体的命名约定。如果你有一个旧的数据库,它具有与ORM不同的命名约定,你将不得不放弃ORM并退回使用SQL。 Kohana的帮助有很多例子。
答案 1 :(得分:0)
$persons = ORM::factory('booking', $id)->persons->with('booking')->find_all();
您可以使用booking
属性为autoloadnig添加load_with
关系:
class Model_Person扩展了ORM {
protected $_belongs_to = array('booking');
protected $_load_with = array('booking');
}
因此,当您加载Person对象时,它将自动与相关的Booking模型一起加入一个查询。
答案 2 :(得分:0)
根据我的经验,我可以说你应该只在你需要的时候使用ORM;有时您最好使用纯SQL查询(使用数据库模块)
现在,当您希望结果成为对象时,您可以在数据库查询上使用 - &gt; execute()方法之前使用 - &gt; as_object(&#39; Model_Name&#39;)方法。 / p>
希望这会有所帮助:)