我现在使用 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();
好的,这应该可行,但我认为这不是最好的解决方案,也不是最漂亮的。有 2 个原因,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 试图找到模型的 id 时tbl_foo2
,如果没有找到,它会返回 NULL,所以无论如何它都会为空!
注意:我也使用了数据库事务(因为这只是过程的一部分),所以如果其中一个查询由于某种原因中断,那么不会运行任何查询。请记住,您必须使用一个支持事务的数据库引擎(我的是 InnoDB)。