Kohana多对多的关系“有很多 - 通过”

时间:2014-01-22 13:48:02

标签: php orm many-to-many kohana relationship

我正在使用kohana v3.3,我想知道是否有可能在数据透视表中获取/保存其他数据?

让我们以Auth为例:

  • 所以我们有3个表(角色,用户,roles_users),我在数据透视表上添加了另一列“date”

表:

  

CREATE TABLE IF NOT NOT EXISTS roles

     

id int(11)UNSIGNED NOT NULL AUTO_INCREMENT,

     

name varchar(32)NOT NULL,

     

description varchar(255)NOT NULL,

     

PRIMARY KEY(id),

     

UNIQUE KEY uniq_namename

     

)ENGINE = InnoDB DEFAULT CHARSET = utf8;

     

-

     

CREATE TABLE IF NOT NOT EXISTS roles_users

     

user_id int(10)UNSIGNED NOT NULL,

     

role_id int(10)UNSIGNED NOT NULL,

     

date时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP,

     

PRIMARY KEY(user_idrole_id),

     

KEY fk_role_idrole_id

     

)ENGINE = InnoDB DEFAULT CHARSET = utf8;

     

-

     

CREATE TABLE IF NOT NOT EXISTS users

     

id int(11)UNSIGNED NOT NULL AUTO_INCREMENT,

     

email varchar(254)NOT NULL,

     

username varchar(32)NOT NULL DEFAULT'',

     

password varchar(64)NOT NULL,

     

logins int(10)UNSIGNED NOT NULL DEFAULT'0',

     

last_login int(10)UNSIGNED,

     

PRIMARY KEY(id),

     

UNIQUE KEY uniq_usernameusername),

     

UNIQUE KEY uniq_emailemail

     

)ENGINE = InnoDB DEFAULT CHARSET = utf8;

模型

  • 模型角色
  

class Model_Auth_Role扩展ORM {

     

protected $ _has_many = array(

  'users' => array('model' => 'User','through' => 'roles_users'),
     

);

  • 用户模型
  

class Model_Auth_User扩展ORM {

     

protected $ _has_many = array(

  'roles'       => array('model' => 'Role', 'through' =>
     

'roles_users'),

     

);

控制器

  

public function action_create()

     

{

  $model = ORM::factory('user');

  $model->username = 'myusername';

  $model->password = 'password';

  $model->email = 'test@example.com';

  $model->save();

  **// How can i set the "date" to "roles_users" table ?**

  $model->add('roles', ORM::factory('role')->where('name', '=',
     

'登录') - >发现());

     

}

     

puboic function action_get()

     

{

     

$ users = ORM :: factory('user') - > find_all();

  foreach ($users as $user)

  {

      $roles = $user->roles->find_all();

      echo $user->email." : <br>";

      **// How can i get the "date" from "roles_users" table ?**

      foreach ($roles as $role)

          echo " ->".$role->name."<br>";

  }
     

}

问题

我有两个问题:

1-如何将“date”设置为“roles_users”表?在控制器action_create()

2-如何从“roles_users”表中获取“日期”?在控制器action_get()

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果这是你想要的,你可以做两件事:

  • 创建一个单独的Model_Roles_User并使用它来创建关系并获取/设置其属性。

这将要求您添加id AUTO_INCREMENT列,因为Kohana本身不支持复合键;或者做一个好人并扩展kohana的功能来支持它: - )

  • 保持原样并对SELECTUPDATE行使用一些自定义查询

这也应该相当容易:

$result = DB::select('date')
    ->from('roles_users')
    ->where('user_id', '=', $user_id)
    ->and_where('role_id', '=', $role_id)
    ->execute();

问题#1的答案相当容易。数据库已经解决了这个问题! (date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,