Kohana - 验证ORM

时间:2012-07-19 18:41:18

标签: kohana kohana-3 kohana-orm kohana-3.2 kohana-db

我现在正在使用Kohana一段时间。我正在使用“has_many”,“has_one”,“belongs_to”没有问题,我的问题是:

如果我有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次保存$ t2与$ t1的关系)和2次因为它可以保存空记录,因为它没有t验证$ t2中是否存在记录。

所以我的主要问题是,应该如何做到这一点?


我自己的解决方案

我使用了biakaveron给我的解决方案,谢谢。 但仍然存在验证问题..所以我花了一些时间并提出了一个解决方案,使用相同的例子:

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

tbl_foo1模型中我添加了规则功能:

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

所以这样,我不必再做另一个查询,这对性能有好处,而且这是一种简单的方法。它起作用,因为,当ORM试图找到模型tbl_foo2的id时,如果找不到它,它会返回NULL,所以无论如何它总是会为空!

注意:我也使用了数据库事务(因为这只是流程的一部分),所以如果其中一个查询由于某种原因而中断,那么就不会运行任何查询。请记住,您必须使用一个支持事务的数据库引擎(我的是InnoDB)。

1 个答案:

答案 0 :(得分: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