Kohana ORM(自定义查询)vs MySQL ORDER BY&通过...分组

时间:2014-05-16 14:59:01

标签: php mysql orm kohana

我有一张包含消息的表。我想将这些消息分组到对话中,检查是否有未读消息并预览最新消息。

我目前的ORM看起来像这样:

$text = new Model_Text;
$text->select(DB::expr('min(`text`.`read`) AS `read_all`'))
->where('time', '>', $time_offset);
->order_by('read', 'DESC')->order_by('time', 'ASC')
->group_by('contact')->with('user')->find_all();

但正如您在订购前了解MySQL组一样,这意味着我没有收到最新消息,而min('text'.'read')技巧确保我始终知道对话是否有未读消息。

要在每个对话中获取最新消息,我会像这样执行MySQL查询:

SELECT min(q1.`read`) as read_all, q2.* FROM texts q1 
INNER JOIN (
    SELECT * FROM texts ORDER BY time DESC
) q2 ON(q1.contact = q2.contact) 
GROUP BY q1.contact 
ORDER BY q2.`time` DESC, q2.`read` ASC

但我完全迷失了如何使用ORM以最佳方式实现此查询。

我最好的猜测是直接用Kohana的DB类执行上述查询,并为返回的每一行加载一个ORM对象。但是,对于我已经检索过的数据,这会导致加载到ORM中的每个会话都有一个数据库命中 - 愚蠢!

让我知道你的想法!

感谢。

1 个答案:

答案 0 :(得分:0)

使用ORM类没有一种好的方法,即使你可以正确地选择数据,你也无法读回来,因为你的Model_Text不会有read_all属性。

我认为最好的方法是使用两个查询,第一个是获取您感兴趣的对话,select contact, min(read) as read_all ... where time > $time_offsetgroup by contact。获得联系人和read_all之后,您可以进行另一个查询,获取每个会话的最新文本,并按照卡尔的建议将其加载到您的Model_Text中:DB::query(DATABASE::SELECT, $sql)->as_object('Model_Text')->execute()