2012-07-19 123 views
-1

我現在正在使用Kohana一段時間。我使用 「的has_many」, 「HAS_ONE」, 「belongs_to的」 沒有問題,我的問題是:Kohana - 驗證ORM(已解決)

如果我有2個表是這樣的:

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(); 

確定,這應該工作,但我認爲這不是最好的解決方案無論是最美麗的。出於兩個原因,1因爲性能 - 它有3個查詢(1節省$ t1,2節查找$ t2,3節節省$ 2與$ t1的關係)和2節因爲它可以節省空記錄,因爲它沒有' t驗證$ t2中記錄的存在。

所以我的主要問題是,這應該怎麼做?

謝謝先進。

自己的解決方案

我用biakaveron給我的解決方案,謝謝。 但儘管如此,有驗證問題..所以我花了一些時間,一個解決方案來了,使用相同的例子:在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(); 

我加了規則功能:

public function rules() 
{ 
    'foo2_id' => array('not_empty') 
} 

所以這樣,我不必做另一個查詢,這對性能有好處,而且這是一個簡單的方法。它的工作原理是,因爲當ORM試圖找到模型tbl_foo2的ID時,如果它沒有找到它,它將返回NULL,所以無論如何它總是空的!

注意:我也使用了DB事務(因爲這只是過程的一部分),所以如果其中一個查詢由於某種原因而中斷,那麼沒有查詢會運行。請記住,你必須使用一個支持事務的數據庫引擎(我的是InnoDB)。

+0

我發現[這個問題](http://stackoverflow.com/questions/9574548/kohana-orm-validate-the-belongs-to-relationship-exists),這與我有關,但仍然存在性能問題.. Kohana必須有更好的方式來做到這一點! – TheGiantBeast 2012-07-19 18:50:07

回答

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(); 

2檢查tbl_foo2_id有特殊的回調。

+0

感謝您提供關於「belongs_to」關係的提示。那麼如何才能拋出關於「tbl_foo2_id」缺失的錯誤,就像模型規則不符合時那樣?謝謝。 – TheGiantBeast 2012-07-19 19:10:41

+0

您應該爲'tbl_foo2_id'添加規則(回調或關閉),這會產生錯誤。也許一個簡單的'not_empty'規則?! – biakaveron 2012-07-20 05:28:05

+0

這就是我所做的!如果你讀了我的問題,我推出了我的解決方案,以解決這種問題:) – TheGiantBeast 2012-07-20 11:04:58