Orm 科哈纳3型甲虫?

Orm 科哈纳3型甲虫?,orm,kohana-3,kohana-orm,Orm,Kohana 3,Kohana Orm,很抱歉问这些关于科哈纳的问题。他们通常被忽视。我想我刚刚发现了一只虫子。我正在两个不直接相关的表之间进行连接 $results = ORM::factory('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id"); 这将生成一个不显式解析表名的查询: SELECT * FROM `foo` JOIN `bar` ON (`foo`.`foreign_id` = `bar`.`id`) 它(在phpMyAdmin中)给出一个

很抱歉问这些关于科哈纳的问题。他们通常被忽视。我想我刚刚发现了一只虫子。我正在两个不直接相关的表之间进行连接

$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
$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute();
protected $_has_many = array(
    'bars' => array('model' => 'bar', 'through' => 'other_table', 'foreign_key' => 'foreign_id'),
    );
请注意,有两个
id
列,一个用于
foo
表,另一个用于
bar
。这是一个真正的问题。因为现在,在我的结果中,如果我循环通过

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

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

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

id    time          foreign_id      blah_int    id  baz
4     1291851245    3           0               3   52501504
$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute();
protected $_has_many = array(
    'bars' => array('model' => 'bar', 'through' => 'other_table', 'foreign_key' => 'foreign_id'),
    );
但是,除非按照预期使用ORM,否则需要指定一些列别名才能使查询正常工作

使用ORM

如果要使用ORM,需要在模型中定义关系。您提到它们与另一个表共享一个关系,因此在您的情况下,您可以使用一个has-many-through关系,如下所示:

id    time          foreign_id      blah_int    id  baz
4     1291851245    3           0               3   52501504
$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute();
protected $_has_many = array(
    'bars' => array('model' => 'bar', 'through' => 'other_table', 'foreign_key' => 'foreign_id'),
    );
尽管你给出的例子表明,直人与人之间有很多关系是可行的:

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数据库对象和查询生成器

如果您更喜欢即席查询并使用查询生成器进行联接,则无论您使用的是Kohana还是原始查询,都可能会有冲突的列名(弹出“SELECT*FROM
foo
JOIN
bar
ON(
foo
foreign\u 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

你试过ORM关系()吗?类似于foreach($foo->bar as$bar){…}表之间没有关联,只是间接关联。它们与另一个表共享关系。因此,我的选择是首先从公共表中加载ID,但我不希望这样。