我可能没有问这个问题,但是这里......我有一个包含2个表的数据库"用户" (对于用户名/密码/等)和" usersInfo" (用户名/姓/地址/等)。我只有1个Users.php类 - 我需要2个单独的类来创建2个对象来保存"用户" &安培; " usersInfo"同一个用户的数据或1个班级的工作(仍然可以制作2个对象?)?
我的一些Users.php类/
public function __construct($user = null) {
$this->_db = DB::getInstance();
$this->_sessionName = Config::get('session/session_name');
$this->_cookieName = Config::get('remember/cookie_name');
if(!$user) {
if(Session::exists($this->_sessionName)) {
$user = Session::get($this->_sessionName);
if($this->find($user) || $this->findUserInfo($user)) {
$this->_isLoggedIn = true;
} else {
//logout
}
}
} else {
$this->find($user);
$this->findUserInfo($user);
}
}
public function find($user = null) {
if($user) {
$field = (is_numeric($user)) ? 'id' : 'username';
$data = $this->_db->get('users', array($field, '=', $user));
if($data->count()) {
$this->_data = $data->first();
return true;
}
}
return false;
}
public function findUserInfo($user = null) {
if($user) {
$test3 = $this->_db->get('users', array('username', '=', $user));
$userId = $test3->first()->id;
$data2 = $this->_db->get('usersInfo', array('user_id', '=', $userId));
if($data2->count()) {
$this->_userInfoData = $data2->first();
return true;
}
}
return false;
}
public function data() {
return $this->_data;
}
public function userInfoData() {
return $this->_userInfoData;
}
目前我必须创建2个对象才能使用同一用户所需的所有数据。
例如,在我的pages.php中,我有:
$user = new User();
$user1 = new User($user->data()->username);
$userNane = $user->data()->username; //holds users username form "users" table
$userName1 = $user1->userInfoData()->first_name; // holds users first name from "usersInfo" table
它有效,但看起来不正确......是有效/可以练习/等等。如果没有,建议?
另外,第一篇文章,请放轻松:)
答案 0 :(得分:0)
两张桌子之间有什么关系? 1-1? 1 *?用户可以拥有多个角色吗?角色可以对应许多用户帐户吗?这种关系将来会改变吗?
根据您的答案,您可能会看到哪种解决方案更适合您的计划。
1-1关系:你可以负担得起一个班级来保存相关记录。从应用程序的角度来看,管理起来会更容易
否则,您需要一次或另一次与另一个表中的相关记录分开处理记录。使用2个区别对象会更好。
如果你打算稍后改变第二种情况,你应该保持原样。
在用户数据的特定情况下,您的评论会带来某些数据比其他数据更敏感的洞察力。回想起来,我想这就是你将这两个表分开的原因。从这个角度来看,即使在1-1关系中,将两个对象分开也一定更好。
关于你的代码,确实,拥有一个专用的UserInfo
类,而不是小心支持User
的另一个实例,显然是一件好事。良好设计的一个非常重要的想法是关注点分离:您希望每个类只处理一个目的,因此对类的任何修改对其余的都有一个有限的影响范围。代码。
作为一个例子,你需要唯一能够检索userinfo行,并因此构造一个包装它的对象,就是用户id。我可能会提取User
实例的iout,并将其传递给adhoc User
构造函数或静态方法,而不是将整个作业委托给UserInfo
方法。班级只处理自己周边的事物。当然,findUserInfo
也可以委托给同一个函数。
答案 1 :(得分:0)
IMO,在设计/开发应用程序时最重要的步骤是创建一个健全的架构和模型。不确定您拥有多少数据库设计经验,但您需要阅读First Normal Form(1NF),最终(2NF和3NF)。
模式设计阶段的一部分是识别您将在应用中引用的所有名词,在您的情况下,user
是一个完美的例子。然后,这些已识别的名词中的每一个都将具有您将要考虑的属性,以及每种名称的存储方式。
您遇到的问题是您有user
和user_info
。正如您所说user
用于名称,密码等,而user_info
用于first_name
,last_name
,address
等。设计阶段的一部分是确定哪些属性直接可归因于用户对象,哪些属性更具辅助性。使用您的示例:name
,password
,first_name
,last_name
均可直接归属于用户名词(对象),但地址本质上更具辅助性,并且可能每个用户不止一个地址(帐单地址,物理地址),因此您可能需要考虑添加user_address
表。如您所见,通过逻辑地分离用户名词(对象)的属性,您开始识别更有意义的关系(user
,user_address
)vs(user
,{{ 1}})。
识别名词并分离其属性后,即可创建架构。从您的模式中,您可以使用像Doctrine这样的对象关系映射器(ORM),它将内省您的模式,并生成供您在整个应用中使用的对象。在你的例子中,你最终会得到两个对象;用户和用户地址。此外,在开发模式时,通过实现外键约束来识别表之间的关系也很重要。例如,您的user_info
表应该有一个user_address
列,该列链接到您的user_id
表。这种方式,当学说对您的模式进行内省时,它也会识别这些关系,这使得编码变得更加容易。
一旦你的ORM到位,你就可以像这样进行代码引用:
user
是的,这是一个非常简单的例子,但是应该正确地证明,如果你正确地设计你的模式,代码就会变成语义,这样就更容易编写和维护。