【问题标题】:Kohana 3.2 validate composite primary keyKohana 3.2 验证复合主键
【发布时间】: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 时,都会使用单个参数调用它。用户或组。但我需要两者来确定数据库中是否已经存在该组合。

如何获取当前模型的字段值?

【问题讨论】:

    标签: php mysql orm kohana kohana-3.2


    【解决方案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 表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2011-12-15
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多