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


How can I refactor my model class in the MVC pattern so I do not repeatedly prepare and query with each method?

有办法重构它吗?水管必须放在某个地方:

这是我的index.php页面:

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);

以下是我的课程:

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;
    }
}

如果我添加一个新方法(同一类),比如:

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联系在一起吗(这对我来说没问题)。

这是使用PHP 5.4,PDO与MySQL。$adapter是我拥有的一个PDO类的包装器。

编辑:我使用的是松散意义上的概念模型、数据库和表。例如,我不认为模型是一张表。这是"M"的一个方面

编辑:我更改了这个:

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

然后在我的呼叫页面:

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

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

我现在有:

<?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;
    }
}

此处模型中的回声用于测试。

您可以不用实现接口,而是使用基类,在该基类中,数据库连接和随后的关闭都在构造函数中进行管理。查询将是一个发送到构造函数的参数。

我认为MVC中的MODEL对如何管理管道(就连接而言)是开放的,它只是根据框架从表到控制器的重要命名约定。

我在php中做了很多这样的工作,但目前我唯一方便的是python->相同的前提。

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

希望这能给你一些想法。