【问题标题】:Kohana: How to load all many-to-many relationships in one queryKohana:如何在一个查询中加载所有多对多关系
【发布时间】:2010-10-15 02:58:28
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您使用 ORM,则根本不需要编写任何 SQL。

    您会发现本指南很有帮助。

    http://www.scribd.com/doc/5022685/Kohana-PHP-ORM-Guide-Volume-1- 我认为这是针对 Kohana 版本 2 中的 ORM,但我不相信它有很大不同。您的里程可能会有所不同。

    请注意,ORM 需要非常具体的命名约定。如果你有一个旧数据库,它的命名约定与 ORM 可以处理的不同,你将不得不放弃 ORM 并重新使用 SQL。 Kohana 帮助中有很多例子。

    【讨论】:

      【解决方案2】:
      1. 试试$persons = ORM::factory('booking', $id)-&gt;persons-&gt;with('booking')-&gt;find_all();
      2. 您可以使用load_with 属性为自动加载添加booking 关系:

        类 Model_Person 扩展 ORM {

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

        }

      因此,当您加载 Person 对象时,它会通过一个查询自动加入相关的 Booking 模型。

      【讨论】:

      • 问题是这是一个多对多的关系。否则我会这样做。 -&gt;with('bookings') 看起来并没有真正做任何事情。
      【解决方案3】:

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

      现在,当您希望结果是一个对象时,您可以在对数据库查询使用 ->execute() 方法之前使用 ->as_object('Model_Name') 方法。

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 2019-04-23
        相关资源
        最近更新 更多