首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MVC模式中重构我的模型类,这样我就不会重复地准备和查询每个方法了?

如何在MVC模式中重构我的模型类,这样我就不会重复地准备和查询每个方法了?
EN

Stack Overflow用户
提问于 2014-08-26 18:25:56
回答 1查看 97关注 0票数 0

有什么办法可以改造这个吗?水管必须放在某个地方:

这是我的index.php页面:

代码语言:javascript
运行
复制
define('BASE_URL', __DIR__);
echo BASE_URL;
require_once(BASE_URL . DIRECTORY_SEPARATOR . "config\\config.php");
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes\\PdoAdapter.class.php");
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes\\Student.class.php");

$adapter = new PdoAdapter(DB_DSN, DB_USER_NAME, DB_PASSWORD);
    $student = new Student($adapter);
    $student->findByStudentID(4);

以下是我的课程:

代码语言:javascript
运行
复制
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes\\IStudent.interface.php");
class Student implements IStudent {

     public function __construct(IRepository $adapter) {
        $this->adapter = $adapter;
    }

    public function findByStudentID($id){
        $sql = 'SELECT * FROM students WHERE student_id = :student_id';
        $this->adapter->connect();
        $this->adapter->prepare($sql);
        $place_holders = array(':student_id' => $id);
        $this->adapter->execute($place_holders);
        $results = $this->adapter->fetchAll();
        //print_r($results);
        foreach ($results as $student){
            echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

        }


        $this->adapter->disconnect();
        echo $sql;

    }

}

如果我添加了一个新方法(相同的类),请说:

代码语言:javascript
运行
复制
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes\\IStudent.interface.php");
class Student implements IStudent {

     public function __construct(IRepository $adapter) {
        $this->adapter = $adapter;
    }

    public function findByLastName($last_name){
        $sql = 'SELECT * FROM students WHERE LAST = :last_name';
        $this->adapter->connect();
        $this->adapter->prepare($sql);
        $place_holders = array(':last_name' => $last_name);
        $this->adapter->execute($place_holders);
        $results = $this->adapter->fetchAll();
        //print_r($results);
        foreach ($results as $student){
            echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

        }


        $this->adapter->disconnect();
        echo $sql;

    }

}

我应该像这样一遍又一遍地做连接、准备、执行吗?我可以成为一个地图绘制者,这将创建一个ORM的类型。但我真的不想要ORM。我得找个地方做这个。这个模型似乎给了我很大的灵活性,但这不是把我和PDO联系在一起了吗(这对我来说是可以的)。

这是使用PHP5.4,PDO与MySQL。$adapter是我所拥有的一个PDO类的包装器。

编辑:我在松散地使用概念模型、数据库和表。例如,我不认为模型是一张桌子。这是“M”的一个方面。

编辑:我改变了这个:

代码语言:javascript
运行
复制
 public function __construct(IRepository $adapter) {
    $this->adapter = $adapter;
    $this->adapter->connect();
}

然后在我的呼召页上:

代码语言:javascript
运行
复制
$adapter = new PdoAdapter(DB_DSN, DB_USER_NAME, DB_PASSWORD);

$student = new Student($adapter);
$student->findByStudentID(4);
$student->findByStudentLastName('Smith');

我觉得这样更好。我还删除了disconnect(),因为我认为PDO在脚本完成后会自动断开连接。

我现在有:

代码语言:javascript
运行
复制
<?PHP
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes\\IStudent.interface.php");
class Student implements IStudent {

     public function __construct(IRepository $adapter) {
        $this->adapter = $adapter;
        $this->adapter->connect();
    }

    public function findByStudentID($id){
        $sql = 'SELECT * FROM students WHERE student_id = :student_id';
        $this->adapter->prepare($sql);
        $place_holders = array(':student_id' => $id);
        $this->adapter->execute($place_holders);
        $results = $this->adapter->fetchAll();
        //print_r($results);
        foreach ($results as $student){
            echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

        }

        echo $sql;

    }
    public function findByStudentLastName($last_name){
        $sql = 'SELECT * FROM students WHERE LAST = :last_name';
        $this->adapter->prepare($sql);
        $place_holders = array(':last_name' => $last_name);
        $this->adapter->execute($place_holders);
        $results = $this->adapter->fetchAll();
        //print_r($results);
        foreach ($results as $student){
            echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

        }
        echo $sql;

    }

}

模型中的回声是用于测试的。

EN

回答 1

Stack Overflow用户

发布于 2014-08-26 18:54:07

您可以避免实现接口,并使用一个基类,其中在构造函数中管理db连接和随后的close。查询将是发送给构造函数的参数。

我认为MVC中的模型是开放的,可以解释管道是如何管理的(就连接而言),它只是一个命名约定,根据框架的不同,从一个表到另一个控制器都很重要。

我在php中做了很多这方面的工作,但我目前手头唯一方便的就是python,尽管如此。

代码语言:javascript
运行
复制
class db_query:

    oracle_instance = ''

    def __init__(self):
        print '-- new db instance --'

    def db_Query( self, host, port, sid, login, passwrd, queryString ):
        try:
            connstr = login + '/' + passwrd + '@' + host + ':' + port + '/' + sid
            connection    = cx_Oracle.connect( connstr )

        except cx_Oracle.DatabaseError as e:
            error, = e.args
            print(error.code)
            print(error.message)
            print(error.context)

        cursor = connection.cursor()
        cursor.arraysize = 200
        try:
            cursor.execute( queryString )
        except cx_Oracle.DatabaseError as e:
            error, = e.args    
            print(error.code)
            print(error.message)
            print(error.context)

        result = []

        for rows in cursor:
            result.append( rows )

        cursor.close()      
        connection.close()

        return result

希望这能给你一些想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25512723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档