2010-12-13 7 views
2

Kohana에 대한 모든 질문은 죄송합니다. 그들은 보통 무시 당한다. 방금 버그를 발견했다고 생각합니다. 직접 관련이없는 두 테이블을 조인하고 있습니다.Kohana 3 ORM의 버그?

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 = ORM::factory('foo')->join("bar")->on("foo.foreign_id", "=", "bar.id"); 

이 명시 적으로 테이블 이름을 확인하지 않는 쿼리를 생성 두 id 열, 하나는 foo 테이블 용이고 다른 하나는 bar 용입니다. 이것은 실제 문제입니다. 지금, 내 결과에서, 만약 내가 루프

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

... 통해 내 결과가 foo 오브젝트를해야하기 때문에 때문에, 나는 4의 ID를 얻을 것으로 예상하지만, 때문에 참여의 날 (3)을주고있다. 이것은 ORM 라이브러리의 버그입니까? 쿼리 결과를 다른 방법으로 제한해야합니까? 난 정말 내가 bar의 ID를 모두로드하고 나서 foo 그런 식으로로드 두 개의 별도의 쿼리를하고 싶지 않아,하지만 내가해야 할 것 같습니다.

$results = DB::select()->from('foo')->join('bar')->on("foo.foreign_id", "=", "bar.id")->execute(); 

당신은 그것이 당신이 ORM을 사용하지 않는 일부 열 별칭 그러나 쿼리 작업을 특정해야합니다

+0

이 http://kohanaframework.org/guide/tutorials.orm (당신이 ORM 관계를 시도 다음과 같이

가 조회를 다시 작성

(here for more information 참조))? foreach와 같은 것 ($ bar처럼 $ foo-> bars) {...} – biakaveron

+0

테이블은 간접적으로 제외하고는 관계가 없습니다. 그들은 다른 테이블과 관계를 공유합니다. 그래서 내 대안은 먼저 테이블에서 ID를로드하는 것이지만 오히려하지 않을 것입니다. – Tesserex

답변

1

은이 같은 원시 쿼리하지 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 같은 문을 사용하여 바의 모든 액세스 할 수 있도록 할 는

시작하는 좋은 장소입니다 당신이 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