Kohana 3.2 验证复合主键
Posted
技术标签:
【中文标题】Kohana 3.2 验证复合主键【英文标题】:Kohana 3.2 validate composite primary key 【发布时间】:2013-09-14 07:57:44 【问题描述】:我有下表
create table `groupusers`(
`id` int not null auto_increment,
`user` varchar(100) not null,
`group` varchar(100) not null,
UNIQUE KEY(`id`),
PRIMARY KEY(`user`, `group`)
)
我的模型是这样的,
class Model_Groupuser extends ORM
protected $_table_name = 'groupusers';
public function rules()
return array(
'user' => array(
array('not_empty'),
array(array($this, 'user_group_not_exists')),
),
'group' => array(
array('not_empty'),
array(array($this, 'user_group_not_exists')),
)
);
public function user_group_not_exists($param)
// Need to get other field's value here.
问题是每次调用user_group_not_exists
时,都会使用单个参数调用它。用户或组。但我需要两者来确定数据库中是否已经存在该组合。
如何获取当前模型的字段值?
【问题讨论】:
【参考方案1】:您可以使用$this->object()
函数获取其他字段值。
public function user_group_not_exists($user_or_group)
$obj = $this->object();
$group = $obj['group'];
$user = $obj['user'];
// Check if ($group, $user) pair exists in db here
【讨论】:
不能同时传递两个值作为参数吗? 评估员只验证一个字段。【参考方案2】:您并没有真正舒适地命名您的表格列。将它们命名为 user
和 group
以及 user
和 group
的关系也会在两者之间产生歧义。
由于 kohana 做了一件很棒的事情,您可以访问表字段、关系等,就好像它是一个对象属性一样。 $i_am_lazy = $object-><field,relation,whatever>
。现在你命名了你的字段和关系,所以不清楚你想得到什么。
您现在可以访问这些 id 的唯一方法如下(或通过 $this->object()
的艰难方式,如另一个答案中所述,无论如何都感觉不好):
$user = $this->user->id;
$group = $this->group->id;
不过,我建议只重命名表格列。
create table `groupusers`(
`id` int not null auto_increment,
`user_id` varchar(100) not null,
`group_id` varchar(100) not null,
UNIQUE KEY(`id`),
PRIMARY KEY(`user`, `group`)
)
这样您就可以简单地使用$this->user_id
或$this->group_id
。
【讨论】:
不遵循命名约定不是问题。您也可以在模型中定义列名和表名,这会覆盖约定。 当然可以,但这样的事情只会让你自己变得更难。当您只需一次重命名列时,为什么要使用$this->object()
。
这里的问题与 kohana ORM 命名约定无关。在原始项目中,我使用了约定。我在这里展示一个例子。而且这里没有关系。只是一个简单的 SINGLE 表。以上是关于Kohana 3.2 验证复合主键的主要内容,如果未能解决你的问题,请参考以下文章