PHP mySQL从子类构造父数据
我有一个包含3个表的数据库<代码>个人,PHP mySQL从子类构造父数据,php,oop,mysqli,Php,Oop,Mysqli,我有一个包含3个表的数据库个人,球员和教练。person表包含球员和教练的共同点,例如名字、姓氏和电子邮件。然后,player和coach表有一个链接,返回到带有personId字段的person表。每个访问网站的人都有一个个人条目。此外,一些用户还可能有player或coach条目。数据库是这样设置的,以保持规范化 在我的代码中,我有一个人,球员,和教练类。球员和教练继承自个人。下面是person和player类的截断版本 class person{ private $firstN
球员
和教练
。person
表包含球员
和教练
的共同点,例如名字
、姓氏
和电子邮件
。然后,player
和coach
表有一个链接,返回到带有personId
字段的person
表。每个访问网站的人都有一个个人
条目。此外,一些用户还可能有player
或coach
条目。数据库是这样设置的,以保持规范化
在我的代码中,我有一个人
,球员
,和教练
类。球员
和教练
继承自个人
。下面是person
和player
类的截断版本
class person{
private $firstName;
private $lastName;
public function __construct($firstName, $lastName){
$this->firstName = $firstName;
$this->lastName = $lastName;
}
}
class player extends person{
private $position;
private $jersey;
public function __construct($firstName, $lastName, $position, $jersey){
parent::__construct($firstName, $lastName);
$this->position = $position;
$this->jersey = $jersey;
}
}
作为一个新手,我对OOP还很陌生,所以如果有什么我不知道的,请容忍我
(旁白,上面的课程是什么,观点?)
现在为了填充这些,我使用了我理解的模型类(是这样吗?)
但现在我的问题的核心是,如何实现playerModel
class playerModel{
public function getPlayer($playerId){
//would I do a join SQL here?
//or would I call personModel::getPerson()
//or do both these options couple the two classes too tightly?
}
}
某种工厂类是另一种选择吗?如果是这样,将如何做到
我需要能够构造person
、player
和coach
对象,因为我有属于所有这些类别的用户
非常感谢您的反馈,如果我需要澄清任何事情,我会经常回来查看。我将从您的附带问题开始,因为术语是谈论OOP的第一个重要部分:
- 你的职业是
person
、player
和coach
。该模型的目的是将现实的重要部分投射到程序中,以便您(作为程序员)能够直观地使用与业务领域相关的术语
- 视图不是一个标准的OOP术语,有时它是数据库中的一个抽象,所以您可以使用一个或多个表的视图,而不是直接使用表。有时它是模型的GUI
您的类personModel
和playerModel
与其说是一个模型,不如说是一个持久性控制器,或者说是一个工厂。如果您想学习OOP以及从关系数据库加载/保存模型的可能性,您可以轻松编写自己的代码,类似于SQL代码。类DBManagement
可以通过loadPersons()
之类的操作来实现这一点。该操作查询数据库,构建所有person对象并返回它们。同样,保存也可以与updatePerson(person$person)
一起使用
稍后,您可以使用某种ORM(对象关系映射器)持久性框架(我自己没有PHP方面的经验,但可能会感兴趣。在Java或.Net中经常使用)
另外,我建议你用另一种方式设计你的模型。实际上,您的想法是正确的,让玩家
和教练
继承个人
,这样您就可以共享像名字
这样的共同属性。但在这种情况下,该模型不够灵活,无法允许您在上一句中提到的内容,即一些用户属于所有类别。一种特殊情况是,一个人,实际上是一名球员,将成为一名教练。例如,如果马丁是一名球员,但现在将成为一名教练,那么你必须用一个马丁物体交换另一个。这意味着马丁不再是以前的那个人,仅仅因为他成为了一名教练,这听起来很奇怪,不是吗
相反,您可以定义,每个用户都是始终一个人
。有些用户是教练
es,有些用户是球员
s,有些用户两者都是,有些用户没有。但总是一个人
一些用于说明的伪代码:
class Person {
string firstName;
string lastName;
List<PersonRole> roles;
}
abstract class PersonRole {}
class Coach extends PersonRole {}
class Player extends PersonRole {
int position;
string jersey;
}
班级人员{
字符串名;
字符串lastName;
列出角色;
}
抽象类PersonRole{}
类Coach扩展PersonRole{}
类播放器扩展PersonRole{
内部位置;
长绒衫;
}
这样,每个用户(=个人)都可以拥有“无对所有”角色。如果用户具有角色,则可以在该角色对象中保存该用户的特定角色属性。当然,一个人的角色列表会随着时间的推移而变化,这取决于他实际扮演的角色
一个很好的副作用是,该模型更符合您的数据库模式,因此您应该可以轻松地将关系数据库模式转换为模型实例,反之亦然
class Person {
string firstName;
string lastName;
List<PersonRole> roles;
}
abstract class PersonRole {}
class Coach extends PersonRole {}
class Player extends PersonRole {
int position;
string jersey;
}