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】:

您并没有真正舒适地命名您的表格列。将它们命名为 usergroup 以及 usergroup 的关系也会在两者之间产生歧义。

由于 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 验证复合主键的主要内容,如果未能解决你的问题,请参考以下文章

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]

使用复合/复合主键的缺点是啥?

hibernate 复合主键映射

将主键更改为复合主键

什么是复合主键

为啥要用多列作为主键(复合主键)