很抱歉询问有关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库中的错误吗?我应该使用不同的方法来限制查询的结果吗?我真的不想做两个单独的查询,我加载所有bar
的id,然后以这种方式加载我的foo
,但它看起来像我必须。
答案 0 :(得分: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 Reference Guide是一个很好的起点
使用Kohana数据库对象和查询构建器
如果您更喜欢使用查询构建器进行即席查询并使用查询构建器进行连接,则无论是使用Kohana还是仅使用原始查询,都可能会发生冲突列名称(弹出“SELECT * FROM foo
JOIN {{1} } ON(bar
。foo
= foreign_id
。bar
)“进入MySQL,你会得到完全相同的结果。)
Kohana,就像MySQL一样,您可以根据这个原因定义列别名。 (见here for more information)
重写您的查询,如下所示:
id
这将返回:
$results = DB::select('id', 'time', 'foreign_id', array('bar.id', 'bar_id'), 'baz')->from('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id")->execute();