首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataMapper,模型

DataMapper,模型
EN

Stack Overflow用户
提问于 2011-12-12 14:35:39
回答 1查看 497关注 0票数 0

我有一个关于“建模,训练”课程的问题,有两个简单的规则不适合我的头脑,这样的训练应该提供,

在我的模型中,无论是'CustomersModelVehicleModel‘i’都必须能够访问查询编写者(SQLBuilder)的方法,但也可以访问数据库,这不会在映射器在工作台上工作时设置映射器,而不是在映射器上设置银行,因此我的情况有点复杂。

设想以下情况:

代码语言:javascript
复制
<?php
   // database access, mapping
   abstract class Mapper { }
   abstract class Model { } 


   interface Connection { } // to recognize it's a database access 
   class MySQL implements Connection { }
   class PgSQL implements Connection { } 

    // SQL Helper, some methods to write a update, insert, delete, select query
   class SQLBuilder { }

   // my custom models
   class Customers extends Model { }

可视化这种结构,即“Customers”,已经可以访问映射器,在这种情况下,我将在Customers表中拥有一个属性“$_table”(以及其他属性),以识别该模型可以工作,但是。我不能访问查询的编写者,而不能访问数据库。为此,我想到了一种方法“main()”,其中setaria连接数据库,使用'setDatabaseConnection ( Connection $connection )‘,但是代码经常重复,想象一下N个模型都使用-> setDatabaseConnectiom,而整个应用程序只使用一个数据库?

我的问题基本上是,提供对数据库的访问,而不使用模型(Customers, Vehicle)中的setter方法,以及查询的编写者。

我不想用的方式是..。

代码语言:javascript
复制
<?php

       // my models
       class Customers extends Model { 

              // method of mapper does'nt implement
              public function getByCity ( $city ) {
                     $query = $this->select()->from($this->_table)->where('city = ?', $city);
                     $resultSet = $this->getConnection()->query( $query );
                     if ( $resultSet->rowCount() > 1 ) {
                            return $resultSet->fetchAll();
                     } else return $resultSet->fetch();
              }

       }

那么我如何使用save ()delete ()update ()这个映射器。在这种情况下,getConnection ()方法必须获得默认连接,并返回类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-14 22:09:05

有几种方法可以处理这件事。您可以有一个工厂类来实例化您的Model类。在以下几个方面:

代码语言:javascript
复制
class ModelLoader {

    public function load($name)
    {
        $class = new $name();
        $class->setConnection(/* set connection class */);
        return $name;
    }
}

$loader = new ModelLoader();
$customer = $loader->load('Customer');

另一种方法可以是在未设置模型类中的连接时设置要使用的默认连接。

代码语言:javascript
复制
interface Connection {}
class MySQL implements Connection {}
class PgSQL implements Connection {}

abstract class Model {

    private $connection = null;

    private static $defaultConnection;

    public function setConnection(Connection $connection = null)
    {
        if ($connection === null) {
            if (!self::$defaultConnection instanceof Connection) {
                throw new Exception('Default connection missing.');
            }
            $connection = self::$defaultConnection;
        }
        $this->connection = $connection;

        return $this;
    }

    public function getConnection()
    {
        if ($this->connection === null) {
            $this->setConnection();
        }
        return $this->connection;
    }

    public static function setDefaultConnection(Connection $connection)
    {
        self::$defaultConnection = $connection;
    }
}

class Customers extends Model { }
class Vehicle extends Model { }


Model::setDefaultConnection(new MySQL);

$customer = new Customers();
$customer->getConnection();

$vehicle = new Vehicle();
$vehicle->setConnection(new PgSQL);

echo '<pre>';
var_dump($customer);
var_dump($vehicle);

// output
object(Customers)#2 (1) {
  ["connection":"Model":private]=>
  object(MySQL)#1 (0) {
  }
}
object(Vehicle)#3 (1) {
  ["connection":"Model":private]=>
  object(PgSQL)#4 (0) {
  }
}

希望这能有所帮助

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

https://stackoverflow.com/questions/8475933

复制
相关文章

相似问题

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