Kohana:如何在一个查询中加载所有多对多关系

时间:2010-10-15 02:58:28

标签: php mysql many-to-many kohana-3

我的数据库关系看起来像这样:

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

3 个答案:

答案 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)

  1. 尝试$persons = ORM::factory('booking', $id)->persons->with('booking')->find_all();
  2. 您可以使用booking属性为autoloadnig添加load_with关系:

    class Model_Person扩展了ORM {

    protected $_belongs_to = array('booking');
    protected $_load_with = array('booking');
    

    }

  3. 因此,当您加载Person对象时,它将自动与相关的Booking模型一起加入一个查询。

答案 2 :(得分:0)

根据我的经验,我可以说你应该只在你需要的时候使用ORM;有时您最好使用纯SQL查询(使用数据库模块)

现在,当您希望结果成为对象时,您可以在数据库查询上使用 - &gt; execute()方法之前使用 - &gt; as_object(&#39; Model_Name&#39;)方法。 / p>

希望这会有所帮助:)