欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

php项目框架搭建(一)【数据库篇】BaseDAO

本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接: 
http://www.firedragonpzy.com.cn/index.php/archives/2237

讨论关于DAO–BaseDAO(正常人都会建立一个基本的DAO,到时候让其余DAO来继承)

1)zf中,有对象关系映射,如果没有设置$_name,$_primary,zf中默认找与类名相同的的表名。如果类中几个单词相连,则把大写字母转小写,然后加下划线。例如:fireDragon(类名),则默认表名为fire_dragon。可以通过$_name,$_primary来设置表名和主键

2)一般我会封装

protected $fields = array();

protected $dbFields = array();

这两个属性,供数据库字段和model(字段分离),这样能够增强项目的健壮性。与之公用的一个一个方法toArray(),在每次获取到结果fetchAll的时候都toArray()一下。toArray()方法如下:

/**

* @author firedragonpzy

* @param array $rowSet

* @return array

*/
protected function toArray($rowSets)

{

$rows = array();

if (!rowSets)

return $rows;

foreach ($rowSets as $row)

{

$tmpRow = array();

$count = count($this->fields);

for ($i = 0; $i < $count; $i++) { $dbField = $this->dbFields[$i];

if (!is_array($row))

{

$tmpRow[$this->fields[$i]] = $row->$dbField;

}else

{

$tmpRow[$this->fields[$i]] = $row[$dbField];

}

}

array_push($rows, $tmpRow);

}

return $rows;

}

3)在BaseDAO,首先需要创建一个基本的获取id的动作,现在哪还有人用自增列啊,用uuid的同时也保证了网站的安全性:

    /**
	 * 获取随机的id
	 * @author firedragonpzy
	 * @return string
	 */
	public function getUUID()
	{
		$db = & $this->getAdapter();
		$result = $db->fetchRow('SELECT UUID() as UUID');
		return $result['UUID'];
	}

4)数据库中肯定用到有关获取当前时间的:

   /**
	 * 获取当前的时间,格式为:1990-01-01 00:00:00
	 * @author firedragonpzy
	 * @return array
	 */
	public function getCurDate()
	{
		return date(self::$DATAFORMAT_TIME,time());
	}
//$DATAFORMAT_TIME是静态的
private static $DATAFORMAT_TIME = "Y-m-d H:i:s";

5)在项目中,肯定用到很多条件查询,所以我封装了一些查询子句,在之后的查询中就方便了:
例如:

function readGetTest()

{

$db = & $this->getAdapter();

$select = $db->select();

$select->from($this->getTableName());

$where = $this->getClauseLike("title", "体育频道");

$where = $this->andClauseNot($where, "title", "体育频道一");

//$where = $this->orClauseNot($where, "title", "asdf");

$select->where($where);

$rowSets = $db->fetchAll($select);

//select * from

return $this->toArray($rowSets);

}

其中,子句的封装如下(注释都很详细我就不一一分析了):

/**

* 得到拼接的子句

* @author firedragonpzy

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @param unknown_type $expr

* @return string

*/

private function getClauseExpr($fieldName,$fieldValue,$expr)

{

$clause = "";

if (!$fieldName || !$fieldValue) {

return $clause;

}

if (is_array($fieldValue)) {

}else

{

if ($expr == "equal")

{

$clause = $fieldName . " = '" . $fieldValue . "'";

} else if ($expr == "like")

{

$clause = $fieldName ." like '%" . $fieldValue . "%'";

} else if ($expr == "not")

{

$clause = $fieldName . " <> '" . $fieldValue . "'";

} else

{

$clause = $fieldName . " = '" . $fieldValue . "'";

}

}

return $clause;

}

/**

* 得到拼接的子句--and

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @param unknown_type $expr

* @return string|unknown

*/

private function andClauseExpr($clause,$fieldName,$fieldValue,$expr)

{

$clause2 = $this->getClauseExpr($fieldName, $fieldValue, $expr);

if (!$clause && !$clause2)

{

return "";

}else if(!$clause)

{

return $clause2;

}else if (!$clause2)

{

return $clause;

}else

{

$clause = "(" . $clause . ")";

$clause2 = "(" . $clause2 . ")";

return $clause . " and " . $clause2;

}

}

/**

* 得到拼接子句--or

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @param unknown_type $expr

* @return string|unknown

*/

private function orClauseExpr($clause,$fieldName,$fieldValue,$expr)

{

$clause2 = $this->getClauseExpr($fieldName, $fieldValue, $expr);

if (!$clause && !clause2)

{

return "";

} else if ( !$clause )

{

return $clause2;

} else if ( !$clause2 )

{

return $clause;

}else

{

$clause = "(" . $clause . ")";

$clause2 = "(" . $clause2 . ")";

return $clause . " or " . $clause2;

}

}

/**

* 得到单个的=子句

* @author firedragonpzy

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return string

*/

protected function getClauseEqual($fieldName,$fieldValue)

{

return $this->getClauseExpr($fieldName, $fieldValue, "equal");

}

/**

* 得到单个的like子句

* @author firedragonpzy

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return string

*/

protected function getClauseLike($fieldName,$fieldValue)

{

return $this->getClauseExpr($fieldName, $fieldValue, "like");

}

/**

* 得到单个的!=(not)子句

* @author firedragonpzy

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return string

*/

protected function getClauseNot($fieldName,$fieldValue)

{

return $this->getClauseExpr($fieldName, $fieldValue, "not");

}

/**

* 得到符合的=子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function andClauseEqual($clause,$fieldName,$fieldValue)

{

return $this->andClauseExpr($clause, $fieldName, $fieldValue, "equal");

}

/**

* 得到符合的like子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function andClauseLike($clause,$fieldName,$fieldValue)

{

return $this->andClauseExpr($clause, $fieldName, $fieldValue, "like");

}

/**

* 得到符合的!=(not)子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function andClauseNot($clause,$fieldName,$fieldValue)

{

return $this->andClauseExpr($clause, $fieldName, $fieldValue, "not");

}

/**

* 得到选择性(or)的=子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function orClauseEqual($clause,$fieldName,$fieldValue)

{

return $this->orClauseExpr($clause, $fieldName, $fieldValue, "equal");

}

/**

* 得到选择性(or)的like子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function orClauseLike($clause,$fieldName,$fieldValue)

{

return $this->orClauseExpr($clause, $fieldName, $fieldValue, "like");

}

/**

* 得到选择性(or)的!=(not)子句

* @author firedragonpzy

* @param unknown_type $clause

* @param unknown_type $fieldName

* @param unknown_type $fieldValue

* @return Ambigous

*/

protected function orClauseNot($clause,$fieldName,$fieldValue)

{

return $this->orClauseExpr($clause, $fieldName, $fieldValue, "not");

}

6)获取order子句,其实这个是无关紧要的,因为我闲麻烦,每次写order的时候都得什么引号什么的,所以直接封装了一个方法,大家会发现我用了默认值,因为很多情况下我们都会根据时间排序,写的框架也不是一个人用,有的人丢三落四,所以我在我封装的很多方法中我都会加默认值,其实这个默认值的封装还是不够好的,应该把数据库的字段和model的分离,这里我没分,主要是考虑到有可能有的数据库不设置时段,或者根据自己的排序字段,所以我也就没有用model字段,而直接用了数据库字段。方法如下:

/**

* 获取order语句

* @author firedragonpzy

* @param unknown_type $orderField

* @param unknown_type $orderDirection

*/

protected function getOrderClause($orderField = "create_date",$orderDirection = "DESC")

{

return $orderField . " " . $orderDirection;

}

7)readRows()方法:最基本的数据查询,包含了查询条件,排序,分页信息。如果不分页,内部已经做了处理。之所以封装一个这种方法,是因为用到的查询用到的太多,将来根据数据库各个字段查询的时候,这个方法也是可以用的,加个条件而已。也就是说,这个是所有查询的根基。方法如下:

/**

* 根据参数获取结果--最基本的查询

* @author firedragonpzy

* @param unknown_type $where

* @param unknown_type $page

* @param unknown_type $orderField

* @param unknown_type $orderDirection

* @return multitype:

*/

protected function readRows($where,$page,$orderField,$orderDirection)

{

if (!$page)

$page = new Page();

$db = & $this->getAdapter();

$select = $db->select();

$select->from($this->_name);

if ($where) {

$select->where($where);

}

$select->order($this->getOrderClause($orderField,$orderDirection));

$select->limitPage($page->getPageNum(), $page->getPageSize());

$rowSets = $db->fetchAll($select);

$rows = $this->toArray($rowSets);

return $rows;

}

8)下面两个是封装的分页的方法,其中readInfoAboutPage方法的访问修饰符我直接设置了public,直接在控制器中访问,所有DAO公用的方法。readRecCount()方法是主要是供分页用的,查询某表的总记录数,详细如下:有关分页的我单独封装了一个分页的实体,详细参考:《php项目框架搭建(三)【实体篇】Page》其中,本次封装的方法如下:

/**

* 获取记录总数(可以带条件)

* @author firedragonpzy

* @param unknown_type $where

* @return Ambigous

*/

protected function readRecCount($where)

{

$db = & $this->getAdapter();

$sql = ' select count(*) from ' . $this->_name;

if ($where)

{

$sql.=" where ". $where;

}

$recCount = $db->fetchOne($sql);

return $recCount;

}

/**

* 获取分页信息

* @author firedragonpzy

* @param unknown_type $page

* @return Result

*/

public function readInfoAboutPage($page)

{

if (!$page)

$page = new Page();

$result = new Result();

$rows = $this->readRows("", $page, $page->getOrderField(), $page->getOrderDirection());

$result->setRows($rows);

$recCount = $this->readRecCount("");

$result->setPage($page->getPageNum, $page->getPageSize, $recCount);

return $result;

}

这时,要是观察仔细的人可能就会发现,怎么有个result,它还有自己的方法。呵呵,这就是框架封装【数据库】(二)要讲解的知识,详情请参考:《php项目框架搭建(二)【数据库篇】Result》

Tags: ,

发表评论