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*FROMfoo
JOINbar
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,但我不希望这样。