2012-07-19 122 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