2012-07-19 3 views
-1

나는 얼마 동안 Kohana를 사용하고 있습니다. "belongs_to"나는, "has_many", "has_one"를 사용하고 문제없이, 내 질문은 :Kohana - ORM 확인 (해결됨)

이 같은 두 테이블이있는 경우 :

tbl_foo1

id | tbl_foo2_id | field1 
------------------------- 
1 | 2   | bar 
2 | 1   | foo 

tbl_foo2

id | field1 
----------- 
1 | foo 
2 | bar 

나는 tbl_foo1이 tbl_foo2에 속하고 tbl_foo2가 많은 tbl_foo1을 가지고 있습니다. 지금까지 그렇게 좋았습니다.

내가 컨트롤러의 관계를 저장하려고하면 문제가 .. 그래서이 코드가 있습니다

$t1 = ORM::factory('tbl_foo1')->values($values, $expected)->create(); 
$t2 = ORM::factory('tbl_foo2', $_POST['id']); 
$t1->tbl_foo2_id = $t2; 
$t1->save(); 

확인이 작동합니다,하지만 난이 최선의 해결책 아니라고 생각 어느 것도 가장 아름다운. 이유는 2 가지가 있습니다. 성능 때문에 1입니다. 3 개의 쿼리 ($ t1을 저장하기 위해 1, $ t2를 찾기 위해 1, $ t2와 $ t2의 관계를 저장하기 위해 3 개)와 빈 레코드를 저장할 수 있으므로 2, $ t2에있는 레코드의 존재를 확인합니다.

제 질문은 어떻게해야합니까?

고맙습니다.

내 자신의 솔루션은 내가 biakaveron 준 솔루션을 사용, 감사합니다.

public function rules() 
{ 
    'foo2_id' => array('not_empty') 
} 
: 나는 규칙 기능을 추가 tbl_foo1 모델

$t2 = ORM::factory('tbl_foo2', $_POST['id']); 
$t1 = ORM::factory('tbl_foo1')->values($values, $expected); 
$t1->foo2 = $t2; // foo2 is a belongs_to relationship 
$t1->create(); 

: 하지만 여전히, 검증 문제는 ..이 있었다 그래서 나는 같은 예제를 사용하여, 약간의 시간을 할애하고 해결책을했다

이렇게하면 다른 쿼리를 수행 할 필요가 없습니다. 이는 성능에 좋으며 간단한 방법입니다. ORM이 모델 tbl_foo2의 ID를 찾을 때 찾지 못하면 NULL을 반환하므로 아무리해도 항상 빈 것입니다.

참고 : DB 트랜잭션도 사용 했으므로 (이는 프로세스의 일부일 뿐이 기 때문에) 어떤 이유로 쿼리 중 하나가 중단되면 쿼리가 실행되지 않습니다. 단지 트랜잭션을 지원하는 하나의 데이터베이스 엔진 (InnoDB)을 사용해야한다는 것을 기억하십시오.

+0

나는이 문제와 관련이있는 [이 질문] (http://stackoverflow.com/questions/9574548/kohana-orm-validate-the-belongs-to-relationship-exists)을 발견했다. 성능의 문제 .. Kohana 그것을 할 수있는 더 좋은 방법이 있어야합니다! – TheGiantBeast

답변

0

1 당신은 belongs_to 객체 모델을 저장할 수 있습니다 특별한 콜백

$t2 = ORM::factory('tbl_foo2', $this->request->post('id')); 
if (!$t2->loaded()) 
{ 
    // wrong ID for tbl_foo2 
} 

$t1 = ORM::factory('tbl_foo1')->values($values, $expected); 
$t1->foo2 = $t2; // foo2 is a belongs_to relationship 
$t1->create(); 

이 확인 tbl_foo2_id합니다.

+0

"belongs_to"관계에 대한 정보 주셔서 감사합니다. 그렇다면 모델 규칙이 맞지 않을 때 "tbl_foo2_id"가 누락 된 것에 대한 오류를 어떻게 던질 수 있습니까? 감사. – TheGiantBeast

+0

'tbl_foo2_id'에 규칙 (콜백 또는 클로저)을 추가해야 오류가 발생합니다. 어쩌면 간단한 'not_empty' 규칙일까요?! – biakaveron

+0

그게 내가 한 짓이야! 당신이 내 질문을 읽으면, 나는 이런 종류의 문제에 내 해결책을 두었다. :) – TheGiantBeast

관련 문제