2011-06-10 51 views
0

我有一个用户,消息和评论。Kohana 3.1 ORM:加入has_many

用户ID user_id的

消息ID user_ID的

评论ID MESSAGE_ID

我可以用得到消息的用户数据()。

$model = ORM::factory('message'); 
$messages = $model 
      ->with('user') 
      ->find_all(); 

('comment')不起作用。我猜是因为它是为一对一关系创建的,而我有has_many注释消息。

如何获得评论数据到$消息?如下所示:['message_id'] ['comment_id'] [DATA]?

回答

1

0定义的关系:

用户的has_many消息 消息的has_many评论 消息belongs_to的用户 评论belongs_to的消息

class Model_User extends ORM { 
    protected $_has_many = array('messages' => array()); 
} 

class Model_Message extends ORM { 
    protected $_belongs_to = array('user' => array()); 
    protected $_has_many = array('comments' => array()); 
} 

class Model_Comment extends ORM { 
    protected $_belongs_to = array('message' => array()); 
} 

1.使用用户的消息:

$messages = ORM::factory('user', $user_id)->messages->find_all(); 
foreach($messages as $message) {...} 

2. Get消息店主:

$user = ORM::factory('message', $message_id)->user; // without find_all()! 

3 Get消息评论:

$comments = ORM::factory('message', $message_id)->comments->find_all(); 
foreach($comments as $comment) {...} 
+0

biakaveron,谢谢你为你解答!我想我还不够清楚。我对这些消息有评论,并希望让它们与消息相同,即[message_id] => array([message_text]),array([comment])。为了迭代他们在一个foreach而不是两个。 – Fenec 2011-06-10 20:17:41

+0

你可以用'join'来做到这一点,但是原因是什么?国际海事组织,少数小型数据库请求比一个大型缓存更容易。添加新消息 - 你必须刷新整个缓存数据,而不是只为新消息添加缓存 – biakaveron 2011-06-11 19:17:20

+0

@biakaveron有一个类似的问题,对于我的(我承担最多的)目的,当迭代消息对象时获得的小DB请求并且执行'$ msg-> comments-> find_all()'是不可缓存的,因为它们带有消息ID,并且有成千上万个。这样做比单一'加入'查询要慢得多,除非你想缓存整个数据集所有的RAM /磁盘,否则结果小的查询是没有用的 - 这对MySQL来说比Kohana好得多。 – Guss 2017-04-30 09:32:12