2

很抱歉问了关于 Kohana 的所有这些问题。他们通常会被忽略。我想我刚刚发现了一个错误。我正在连接两个不直接相关的表。

$results = ORM::factory('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id");

这会生成一个不会显式解析表名的查询:

SELECT * FROM `foo` JOIN `bar` ON (`foo`.`foreign_id` = `bar`.`id`)

这给了(在 phpMyAdmin 中)一个如下所示的表:

id    time          foreign_id      blah_int    id  baz
4     1291851245    3           0               3   52501504

请注意,有两id列,一列用于foo表格,一列用于bar. 这是一个真正的问题。因为现在,在我的结果中,如果我循环...

foreach ($results as $result) {
    echo $result->id;    // prints 3!!!
}

因为我的结果应该是foo对象,所以我希望得到 4 的 id,但由于加入,它给了我 3。这是 ORM 库中的错误吗?我应该使用不同的方法来限制我的查询结果吗?我真的不想在加载所有bars id 的地方执行两个单独的查询,然后foo以这种方式加载我的 s,但看起来我必须这样做。

4

1 回答 1

1

您必须使用 Database 对象来构建原始查询,而不是 ORM,如下所示:

$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute();

但是,除非您按预期使用 ORM,否则您将需要指定一些列别名才能使您的查询正常工作。

使用 ORM

如果要使用 ORM,则需要在模型中定义关系。您提到他们与另一个表共享关系,因此在您的情况下,您可以使用这样的有很多直通关系:

protected $_has_many = array(
    'bars' => array('model' => 'bar', 'through' => 'other_table', 'foreign_key' => 'foreign_id'),
    );

尽管您给出的示例表明直接的 has_many 关系会起作用:

protected $_has_many = array(
    'bars' => array('model' => 'bar','foreign_key' => 'foreign_id'),
    );

这将允许您使用如下语句访问所有条形图

$bars = $results->bars->find_all();
foreach($bars as $bar)
{
    echo $bar->id; // should echo 4, assuming one record in bars with id 4
}

如果您想了解有关 ORM 和关系的更多信息,Kohana 3.1 ORM 参考指南是一个很好的起点

使用 Kohana 数据库对象和查询生成器

如果您更喜欢临时查询并使用查询构建器进行连接,那么无论您使用的是 Kohana 还是只是原始查询(将“SELECT * FROM fooJOIN barON ( foo. foreign_id= bar. id)”弹出到 MySQL 中,您都可能会遇到列名冲突,您将得到完全相同的结果)。

Kohana,就像 MySQL 一样,正是出于这个原因,您可以定义列别名。(请参阅此处了解更多信息

重写您的查询如下:

$results = DB::select('id', 'time', 'foreign_id', array('bar.id', 'bar_id'), 'baz')->from('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id")->execute();

这将返回:

id    time          foreign_id      blah_int    bar_id   baz
4     1291851245    3               0           3        52501504
于 2011-06-01T15:17:33.403 回答