【问题标题】:Kohana - Validate ORMKohana - 验证 ORM
【发布时间】:2012-07-19 18:41:18
【问题描述】:

我使用 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)。

【问题讨论】:

  • 查到了this question,和我的有关系,但是还是有性能问题..小花一定有更好的办法!
  • 请在自己的答案中发布您的解决方案,而不是作为编辑。

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


【解决方案1】:

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

【讨论】:

  • 感谢有关“belongs_to”关系的提示。那么我怎样才能抛出关于“缺失”tbl_foo2_id 的错误,就像模型规则不符合时的错误一样?谢谢。
  • 您应该为tbl_foo2_id 添加规则(回调或关闭),这将产生错误。也许是一个简单的not_empty 规则?!
  • 我就是这么做的!如果您阅读了我的问题,我将解决此类问题的方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多