zendframework 2 Model 数据模型的使用方法

刚认识zf2时, 对数据模型比较陌生. 接触一段时间后, 才能慢慢上手. 故留下笔记供大家参考.


1.使用方法

以下为获取一行记录封装好的函数.

        /**
	 * select 获取一条记录
	 * 
	 * @param array|string $where : 兼容getRow(1)
	 * @param array $extra
	 * @return Array
	 */
	public function getRow($where = '', $extra = array())
	{
		$sql = $this->sql;
		$select = $sql->select();
		
		if (isset($where['or']) && is_array($where))
		{
			$select->where($this->_getWhere($where['or']), 'OR');
			$where['or'] = '';
			unset($where['or']);
		}
		if ($where)
		{
			$select->where($this->_getWhere($where));
		}
		if (isset($extra['join']))
		{
			//$extra['join'] = array(array('t2' => 'table2'), 'name' => 't2.name', '*', 'left');
			$select->join(
					$extra['join'][0],//第二个表, 别名用法
					$extra['join'][1],
					isset($extra['join'][3]) ? $extra['join'][3] : '*',
					isset($extra['join'][4]) ? $extra['join'][4] : 'left'
			);
		}
 		isset($extra['group']) && $select->group($extra['group']);
 		isset($extra['having']) && $select->having($extra['having']);
 		isset($extra['columns']) && $select->columns($extra['columns']);
 		
		$this->log('getRow='.$this->sql->getSqlStringForSqlObject($select));
		$rowset = $this->selectWith($select);
		return $this->iconv($rowset->current(), true);
	}


其中对where 进行了封装, 实现传入多种用途, 如 like , between 等方法


        /**
	 * 解析where
	 * 
	 * @param array $where
	 * array(
	 *  'id' => '4',
	 *  'id' => array(4, 5), //in 操作
	 *  'like' => array('name' => 'abc', 'word' => 'hello'),
	 *  'between' => array('id' => array('3', '12')),
	 *  'not' => array('name' => 'abc', 'word' => 'hello'),// name != 'abc' and word != 'hello'
	 *  'or' => array('name' => 'abc', 'word' => 'hello'),//生成 where name = 'abc' or word = 'hello' and ...
	 * )
	 * @return array
	 */
	private function _getWhere($where)
	{
		$whereArr = array();
		if (!is_array($where))
		{
			$whereArr = array($this->primaryKey => $where);
		}
		elseif (is_array($where))
		{
			foreach ($where as $key => $val)
			{
				switch ($key)
				{
					case 'like' : 
						foreach ($val as $itemKey => $itemVal) {
							$whereArr[] = $this->sql->select()->where->like($itemKey, $itemVal);
						}
						break;
					case 'not' : 
						foreach ($val as $itemKey => $itemVal) {
							$whereArr[] = new Operator($itemKey, '!=', $itemVal);
						}
						break;
					case 'between' :
						foreach ($val as $itemKey => $itemVal) {
							$whereArr[] = $this->sql->select()->where->between($itemKey, $itemVal[0], $itemVal[1]);
						}
						break;
					case 'greater' : 
						foreach ($val as $itemKey => $itemVal) {
							$whereArr[] = new Operator($itemKey, '>=', $itemVal);
						}
						break;
					default:
						$whereArr[$key] = $val;
				}
			}
		}
		
		return $whereArr;
	}


当获取多行 getList 时以此类推..


2. 关于代码的复用

我目前的方式是把getRow, getList, insert, update, delete 封装到模型的继承类中, 这样就不必为每个模型写这些基本操作. 当然若遇到业务复杂时, 可单独在模型中开小灶, 单独写.


Author : xlhui1985@126.com

Time : 2013.8.30 周五





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值