Вы должны использовать объект базы данных для создания необработанных запросов, а не 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
}
Справочное руководство Kohana 3.1 ORM - хорошее место для начала, если вы хотите узнать больше об ORM и отношениях
Использование объекта базы данных Kohana и построителя запросов
Если вы предпочитаете специальные запросы и выполняете объединения с использованием построителя запросов, у вас, скорее всего, будут конфликтующие имена столбцов, независимо от того, используете ли вы Kohana или просто необработанные запросы (pop "SELECT * FROM foo
JOIN bar
ON (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