代码之家  ›  专栏  ›  技术社区  ›  Svish

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

  •  1
  • Svish  · 技术社区  · 14 年前

    我的数据库关系如下:

    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 回复  |  直到 14 年前
        1
  •  0
  •   hookenz    14 年前

    如果您使用的是orm,则根本不需要编写任何sql。

    你会发现这本指南很有帮助。

    http://www.scribd.com/doc/5022685/Kohana-PHP-ORM-Guide-Volume-1- 我认为这是针对柯哈纳版本2中的orm的,但我不认为它有什么特别的不同。你的里程可能不同。

    请注意,orm需要相当具体的命名约定。如果您有一个旧数据库,它的命名约定与orm所能处理的不同,那么您将不得不放弃orm,转而使用sql。在kohana帮助中有很多这样的例子。

        2
  •  0
  •   biakaveron    14 年前
    1. 尝试 $persons = ORM::factory('booking', $id)->persons->with('booking')->find_all();
    2. 您可以添加 booking 自体移植的关系 load_with 属性:

      类模型_person extends orm{

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

      }

    因此,当您加载person对象时,它将自动与相关的预订模型连接,只需一个查询。

        3
  •  0
  •   helpse    11 年前

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

    现在,如果希望结果是对象,可以在对数据库查询使用->execute()方法之前使用->as_object('model_name')方法。

    希望这有帮助:)

    推荐文章