2011-05-15 41 views
1

我正在构建一个站点,并且在多个模型中有多个代码段,需要在事务中运行,所以如果出现故障,代码将回滚。MVC跨多个模型的事务性PDO

说我有一个简单的形式来注册一个用户。

<form action="/register" method="POST"> 
     <div> 
      <label for="username">Username</label> 
      <input type="text" name="username" id="username" />   
     </div> 
     <div> 
      <label for="username">Password</label> 
      <input type="password" name="password" id="password" /> 
     </div> 
     <div> 
      <label for="username">Email</label> 
      <input type="text" name="email" id="email" /> 
     </div> 
     <div><input type="submit" name="submit" value="submit" /></div> 
    </form> 

在我的系统中创建用户时,我需要自动将它们放在一个角色中。

要插入用户表,我使用我的用户模型。然后我需要插入发生在单独模型中的角色表。如果所有工作都需要在不同的模型中完成,那么我应该在哪里创建连接以跨多个模型传递以允许事务工作?

// Start Transaction. 
// Create new user based on posted variables. UserModel 
// Add user to a given role. UserRoleModel -> Table contains UserId and RoleId 
// Commit transaction. 

也许我困惑的是,所有的工作都要创造一个用户在我的用户模型中?即使这个工作跨越了不仅仅是用户数据库表?我的假设是数据库中的每个表都应该有一个模型类,并且该模型类应该只在该表内工作?我错了吗?

感谢

+0

以及在我的情况下,我使用的表格模型的最外层做涉及交易,其他表。你使用哪个框架 – Ibu 2011-05-15 22:41:34

+0

没有框架。真的想学习和理解最好的方法。所以你说你的UserModel里面,创建,你会插入到用户表,然后插入到user_role表? – Dietpixel 2011-05-15 22:44:22

回答

0

正如我说在我的评论,外层可以与其他表进行交互:

型号

1 DataBase 
    2 => UserTableDefinition 
      3 => UserDefaultInteraction 
        4 => UserCustomFunctions 
          5 => UserOuterLayer 

和用户角色可以设置相同的方式。现在所有的模型只能使用外层相互作用(5);

既然你在学习,我会给你一个详细的例子,所以你可以考虑使用一种强大的方式来处理你的模型,这只是使它更容易。 例如:

class UserOuterLayer extends UserCustomFunctions { 

    public function createNewUser ($data) { 
     // create a new user from array 
     $user = new self(); 
     $user->setName($data['name']); 
     $user->setUserName($data['username']); 
     $user->setPassword($data['password']); 
     $user->setRole($data['role']); 

     if ($user->save()) { // when the object is saved it assign a new value for $user->id 
      $role = new UserRole(); // accessing another model 
      $role->setUserId($user->getId()); // returns the new id from the saved object 
      $role->setRole($user->getRole()); 
      $role->save(); 
     }  
    } 
} 

在你学习的好运气,我希望这是有道理:)

+0

也许它,但你忘记$前数据 – dynamic 2011-05-15 23:19:58

+0

@ yes123谢谢你,我现在做了改变 – Ibu 2011-05-15 23:21:59

+0

大声笑...你仍然忘记了一些$ – dynamic 2011-05-15 23:22:41