php设计模式在实际项目,我在项目中使用带有PHP的工作单位设计模式

我正在使用工作单元设计模式的项目.它包括Storage,EntityCollection等.工作单元的代码包括PDO适配器代码文件.但是适配器不完整,无法运行查询.我从某处找到了文件.

我无法建立我想要的查询.每次编写代码时,我都会遇到许多与查询有关的问题.所以,请您帮我使其更加灵活…例如,我想像这样运行:$db-> select()-> where(‘id>:id’)-> andWhere(”) -> orWHere()-> orderBy()-> groupBy()-> having()-> fetch()/ fetchOne();或类似的东西.

namespace D\Adapter;

class PdoAdapter implements \D\DB\DatabaseInterface {

protected $config = array();

protected $database;

protected $connection;

protected $statement;

protected $fetchMode = \PDO::FETCH_ASSOC;

public function __construct($dsn, $username = null, $password = null, array $driverOptions = array()) {

$this->config = compact("dsn", "username", "password", "driverOptions");

$this->database = $driverOptions['db_name'];

}

public function getStatement() {

if ($this->statement === null) {

throw new \PDOException(

"There is no PDOStatement object for use.");

}

return $this->statement;

}

public function connect() {

// if there is a PDO object already, return early

if ($this->connection) {

return;

}

try {

$this->connection = new \PDO(

$this->config["dsn"], $this->config["username"], $this->config["password"], $this->config["driverOptions"]);

$this->connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

$this->connection->setAttribute(

\PDO::ATTR_EMULATE_PREPARES, false);

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function disconnect() {

$this->connection = null;

}

public function prepare($sql, array $options = array()) {

$this->connect();

try {

$this->statement = $this->connection->prepare($sql, $options);

return $this;

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function execute(array $parameters = array()) {

try {

$this->getStatement()->execute($parameters);

return $this;

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function countAffectedRows() {

try {

return $this->getStatement()->rowCount();

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

/**

* countAffectedRows iin Alias

*/

public function count() {

try {

return $this->getStatement()->rowCount();

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function getLastInsertId($name = null) {

$this->connect();

return $this->connection->lastInsertId($name);

}

public function fetch($fetchStyle = null, $cursorOrientation = null, $cursorOffset = null) {

if ($fetchStyle === null) {

$fetchStyle = $this->fetchMode;

}

try {

return $this->getStatement()->fetch($fetchStyle, $cursorOrientation, $cursorOffset);

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function fetchAll($fetchStyle = null, $column = 0) {

if ($fetchStyle === null) {

$fetchStyle = $this->fetchMode;

}

try {

return $fetchStyle === \PDO::FETCH_COLUMN ? $this->getStatement()->fetchAll($fetchStyle, $column) : $this->getStatement()->fetchAll($fetchStyle);

} catch (\PDOException $e) {

throw new \RunTimeException($e->getMessage());

}

}

public function select($table, $bind = array(), $where = "", $options = array()) {

if (count($bind) > 0) {

foreach ($bind as $col => $value) {

unset($bind[$col]);

$bind[":" . $col] = $value;

}

}

if (isset($options['fields'])) {

$fields = $options['fields'];

} else {

$fields = '*';

}

$sql = "SELECT " . $fields . " FROM " . $table . " ";

if (strlen($where) > 2) {

$sql .= "WHERE " . $where;

}

// set_flash($sql);

$this->prepare($sql)

->execute($bind);

return $this;

}

public function query($sql, array $bind = array()) {

if (is_array($bind)) {

foreach ($bind as $col => $value) {

unset($bind[$col]);

$bind[":" . $col] = $value;

}

}

$this->prepare($sql)

->execute($bind);

return $this;

}

public function insert($table, array $bind) {

$cols = implode(", ", array_keys($bind));

$values = implode(", :", array_keys($bind));

foreach ($bind as $col => $value) {

unset($bind[$col]);

$bind[":" . $col] = $value;

}

$sql = "INSERT INTO " . $table

. " (" . $cols . ") VALUES (:" . $values . ")";

return (int) $this->prepare($sql)

->execute($bind)

->getLastInsertId();

}

public function update($table, array $bind, $where = "") {

$set = array();

foreach ($bind as $col => $value) {

unset($bind[$col]);

$bind[":" . $col] = $value;

$set[] = $col . " = :" . $col;

}

$sql = "UPDATE " . $table . " SET " . implode(", ", $set)

. (($where) ? " WHERE " . $where : " ");

return $this->prepare($sql)

->execute($bind)

->countAffectedRows();

}

public function delete($table, $where = "") {

$sql = "DELETE FROM " . $table . (($where) ? " WHERE " . $where : " ");

return $this->prepare($sql)

->execute()

->countAffectedRows();

}

public function fetchAllTables() {

$sql = "SHOW TABLES FROM " . $this->database;

$this->prepare($sql)

->execute();

return $this;

}

public function fetchAllFields($table) {

$sql = "SHOW FIELDS FROM " . $table;

$this->prepare($sql)

->execute();

return $this;

}

}

解决方法:

首先,UnitOfWork模式的关注点是跟踪您在业务交易过程中可能影响数据库的所有操作.交易后,它会根据您的工作找出更改数据库所需要做的一切.您的班级还有其他问题.

它看起来像一个神职人员(反模式).它有多个职责:Connection,PeparedStatement,Execution和其他助手.它很难扩展和维护.尝试以SOLID方式将所有职责划分为不同的类别,并采用相应的设计模式.

您在代码中面临的想法已经由其他框架完成.再次实现它非常艰苦.例如,您可以尝试Doctrine ORM/DBAL Framework.

标签:unit-of-work,adapter,php,database,pdo

来源: https://codeday.me/bug/20191030/1964230.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值