2010-12-13 1 views
2

Извините, что задали все эти вопросы о Кохане. Их обычно игнорируют. Кажется, я просто нашел ошибку. Я делаю соединение между двумя таблицами, которые напрямую не связаны.Ошибка в Kohana 3 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) таблицу, которая выглядит следующим образом:

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, но это дает мне-из-за соединением. Это ошибка в библиотеке ORM? Должен ли я использовать другой метод для ограничения моих результатов запроса? Я действительно не хочу делать два отдельных запроса, когда я загружаю все id bar, а затем загружаю его foo, но похоже, что я должен.

+0

Вы пробовали ORM отношения (http://kohanaframework.org/guide/tutorials.orm)? Что-то вроде foreach ($ foo-> bars as $ bar) {...} – biakaveron

+0

Таблицы не связаны, кроме как косвенно. Они разделяют отношения с другой таблицей. Поэтому моя альтернатива заключается в том, чтобы сначала загружать идентификаторы из таблицы, но я бы предпочел. – Tesserex

ответ

1

Вы должны использовать объект базы данных для создания необработанных запросов, не 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 Reference Guide хорошее место, чтобы начать если вы хотите узнать больше о ОРМЕ и отношениях

Использования объекта базы данных Kohana и строителя

запроса Если вы предпочитаете нерегламентированные запросы и делаете присоединяется с помощью конструктора запросов вы, вероятно, уже сталкивающиеся имен столбцов независимо если вы используете Kohana или просто сырые запросы (поп "SELECT * FROM foo JOIN bar ON (foo. foreign_id = bar. id) «в MySQL, и вы получите точный результат).

Kohana, как и MySQL, позволяет определить псевдонимы столбцов именно по этой причине.(См here for more information)

Перепишите запрос следующим образом:

$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