1

在我想今天尝试一下之前从未使用过 ORM,但我遇到了我不知道如何解决的第一个问题(由于我不了解 ORM 的真正工作原理。)

假设我有三个表:语言、代码和数据透视表 Codes_Languages。这些都在模型中正确定义了关系。

现在,为了呼应所有语言的名称,我可以这样:

$languages = ORM::factory('languages')->find_all();
foreach ($languages as $language)
{
  echo $language->name, '<br />';
}

如果我想回显特定语言中的所有代码名称,我可以这样:

$language = ORM::factory('languages', 1);
foreach ($language->codes as $code)
{
  echo $code->title, ' ', $code->description;
}

但是如果我需要这样做呢:检索每种语言的最新五个代码(由 DESC 在 code.time_posted 上排序)?

$languages = ORM::factory('languages')->find_all();
???$languages->codes = ORM->order_by('time_posted', 'desc')->limit(5);???
foreach ($languages as $language)
{
  echo $language->name, '<br />';
  foreach ($language->codes as $code)
  {
    echo $code->name, ' ', $code->description;
  }
}

我在一些伪代码周围放置了问号,我认为这些伪代码可以解释我正在尝试做的事情。我最近从 CodeIngiter 转换过来,因为我认为 Kohana 是经过深思熟虑的,但是文档似乎缺乏,我不知道如何做我需要的。

任何指导都会很棒。谢谢。

4

3 回答 3

1

免责声明:我从未使用过 Kohana 的 ORM,但从阅读文档来看,您似乎需要这样的东西:

ORM::factory('languages')->orderby('time_posted', 'DESC')->find_all(5);

您可以在 ORM 对象上使用几乎所有 Kohana 的查询构建器方法(例如orderbyjoin)来执行更复杂的查询。

(就 PHP 的 ORM 而言,Doctrine几乎是最好的。它应该与 Kohana 或任何其他框架很好地集成。)

于 2009-09-03T08:00:43.313 回答
0

尝试这个:

$languages = ORM::factory('languages')->find_all();

foreach ($languages as $language)
{
  echo $language->name, '<br />';
  foreach ($language->order_by('time_posted', 'desc')->limit(5)->codes as $code)
  {
    echo $code->name, ' ', $code->description;
  }
}

我还没有测试过,但它应该可以工作;我已经使用 Kohana 的 ORM 几个星期了。

于 2009-09-08T17:23:24.940 回答
0

Kohana 中的 ORM 仅在您遵循以下条件时才有效:

  1. 表名必须是复数形式(如“语言”,您已经完成了);
  2. 表必须有一个自动递增的 id(必需);
  3. 您必须创建一个扩展 ORM 类的模型(这个不是复数形式,“语言”),例如:

    类 Language_Model 扩展 ORM { }

稍后您可以按照 kohana 的文档向上面的类发布一些附加参数。

于 2009-09-05T04:11:44.253 回答