我在模型部分有一个类,它选择一个数据映射器,在我的情况下,我关心的是sql数据库和设置现有对象的属性。
所以目前我这样做是为了让我的组织级
控制器
class controller
{
public function invoke()
{
$organization = $this->model->organization($id);
//pick view
}
}
型号
class model
{
public $database
//construct $database connection
public function organization($id)
{
$organization = $this->database->get_by_id($id, 'organizations', 'organization');
//$organization = new organization();
$organization->stakeholder = $this->database->join_one('stakeholders', 'stakeholder_category', 'stakeholder_id', '1', 'entity_id', $id);
$organization->document['document_affiliated_organization'] = $this->database->join_one('documents', 'authors', 'document_id', 1, 'author_id', $id);
$organization->document['document_audience_organization'] = $this->database->join_one('documents', 'document_audience', 'document_id', 1, 'audience_id', $id);
//people that are members of this organization
$organization->membership['organization_membership_person'] = $this->database->join_one('people', 'membership', 'member_id', 0, 'organization', $id);
//organizations that are members of this organization
$organization->membership['organization_membership_organization'] = $this->database->join_one('organizations', 'membership', 'member_id', 1, 'organization', $id);
//organizations that this organization is a member of
$organization->membership['member_of'] = $this->database->join_one('organizations', 'membership', 'organization', 1, 'member_id', $id);
$organization->event['event_affiliated_organization'] = $this->database->join_one('events', 'event_organizer', 'event', 1, 'organizer', $id);
return $organization;
}
}
class organization//extends model if I were to add the funcion discussed below
{
//database table values
public $model_type = 'Organization';
public $id;//organization table
public $name;//organization table
public $stakeholder;//organization table join with stakeholder table (array)
public $membership;//organization table join with membership table fetchall (array)
public $document;//organization table join with document table fetchall (array)
public $event;//organization table join with event table fetchall (array)
你对这个组织课上的一个功能有什么想法?
public function organization($id)
{
$organization = $this->database->get_by_id($id, 'organizations', 'organization');
//$organization = new organization();
$organization->stakeholder = $this->database->join_one('stakeholders', 'stakeholder_category', 'stakeholder_id', '1', 'entity_id', $id);
$organization->document['document_affiliated_organization'] = $this->database->join_one('documents', 'authors', 'document_id', 1, 'author_id', $id);
$organization->document['document_audience_organization'] = $this->database->join_one('documents', 'document_audience', 'document_id', 1, 'audience_id', $id);
//people that are members of this organization
$organization->membership['organization_membership_person'] = $this->database->join_one('people', 'membership', 'member_id', 0, 'organization', $id);
//organizations that are members of this organization
$organization->membership['organization_membership_organization'] = $this->database->join_one('organizations', 'membership', 'member_id', 1, 'organization', $id);
//organizations that this organization is a member of
$organization->membership['member_of'] = $this->database->join_one('organizations', 'membership', 'organization', 1, 'member_id', $id);
$organization->event['event_affiliated_organization'] = $this->database->join_one('events', 'event_organizer', 'event', 1, 'organizer', $id);
return $organization;//End of proposed function which I am not currently using
}
这是我在上调用的数据库类函数
public static function get_by_id($id,$table,$class)
{
try
{
$core = self::getInstance();
$core->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM $table where id = :id limit 1";
$statement = $core->dbh->prepare($sql);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
if (!isset($class))
{
$class = '__CLASS__';
}
$statement->setFetchMode(PDO::FETCH_CLASS, $class);
$statement->execute();
$result = $statement->fetch();
可选地,我想我最好做一个PDO::FETCH_INTO,$class
// Return results
return $result;
}
catch (PDOException $exception)
{
die($exception->getMessage());
}
}
public static function join_one($table1,$table2,$join_column_id,$person_or_organization,$where_column_id,$id)
{
$sql = "SELECT $table1.name, $table1.id
FROM $table1
JOIN $table2 ON $table1.id=$table2.$join_column_id
WHERE $table2.person_or_organization=$person_or_organization AND $table2.$where_column_id=$id";
return self::get_by_sql($sql);
}
这对我很有效。以下是我想知道该怎么做的一些事情。
我的属性现在的工作方式类似于这个Main对象(组织),其属性由一个fetch设置,然后将对象设置为特定的属性,这些属性是现有组织类的类型(数组)。你对类型转换(对象与对象中的数组)有什么看法?我应该把什么逻辑放在哪里?
我不知道为什么没有其他人回复你。。。我将尝试一下。让我们从一个小术语开始,类就是一个类,类中的函数就是一个方法。
有很多方法可以实现MVC系统,但我不认为你的方法是其中之一。你不创建一个模型类,而是创建一个名为组织的类,它就是你的模型。一般的方法是
索引/列表显示/数据新建/创建编辑使现代化销毁
控制器处理页面逻辑,目标是使其尽可能精简。我不确定你是否可以有一个控制器完全是一个类。。。这也许是可能的,但我通常把我的锉刀做成平锉。视图处理输出。你真的应该多读MVC。。。上面有很多不错的文章。你还应该研究一个PDO包装类。我可以推荐http://www.imavex.com/php-pdo-wrapper-class/.您还应该了解为什么单例模式不好,以及依赖注入是如何好的。
所以无论如何。。。。让我给你一些快速代码。。。它不会很好看,也不会很管用,但它应该让人明白。。。。看起来你想显示一个组织,在功能编程中,你可能会编写一些类似org.php的代码?id=123…更好的方法是REST设置.org/view/123…无论哪种方式,代码都是一样的,但调用代码的方式会改变。。。
所以控制器有点像
$Org = new Org($dbClass);
if (isset($_REQUEST["id"]){
$orgData = $Org->data($_REQUEST["id");
}
现在的模型是..
class Org
{
public $dbClass; //stores db class
public function __construct($dbClass){
//its usually good form to type hint the db class interface
$this->dbClass = $dbClass;
}
public function data($id){
return $this->dbClass->run("SELECT * FROM org WHERE orgID = $id");
// NOTE THIS IS VERY INSECURE
}
}
最后你的观点
foreach ($orgData as $key=>$value){
echo $key." : ".$value."<br/>";
}