getModel(); $attributes = $model->attributes; $fields = array_keys($attributes); foreach ($fields as $key) { if (isset($data[$key])) { $model->$key = $data[$key]; } } $model->save(); if ($returnObject) { return $model; } return $model->attributes; } /** * 批量添加 */ public function batchAdd($data) { $model = $this->getModel(); foreach ($data as $attributes) { $otherModel = clone $model; // false 不检测字段安全 true 需要在model设置rules $otherModel->setAttributes($attributes, false); $otherModel->save(); } } /** * 取表的字段 */ public function getFields() { $model = $this->getModel(); $attributes = $model->attributes; return array_keys($attributes); } /** * 根据主键ID删除一条记录 */ public function deleteById($id) { $return = $this->conditionQuery(['id' => $id])->delete(); return $return; } /** *根据条件删除一条或多条记录 */ public function deleteByCondition($condition) { if (empty($condition)) { return 0; } $where = array(); $variable = array(); foreach ($condition as $key => $val) { $where[] = $key . '=:' . $key; $variable[':' . $key] = $val; } $whereString = implode(' and ', $where); $count = self::deleteAll($whereString, $variable); return $count; } /** * 根据主键ID更新一条记录 */ public function updateById($id, $data) { $model = $this->getModel(); $attributes = $model->attributes; $fields = array_keys($attributes); foreach ($data as $key => $val) { if (in_array($key, $fields) == false) { //删除表里不存在字段不进行保存 unset($data[$key]); } } $re = self::updateAll($data, 'id=:id', ['id' => $id]); if ($re == 1) { return ['status' => true, 'data' => $data]; } return ['status' => false, 'data' => $data]; } //多个主键更新 shish 2019.9.3 public function updateByIds($ids, $data) { self::updateAll($data, ['id' => $ids]); } /** * 根据条件更新一条或多条记录 */ public function updateByCondition($condition, $data) { if (empty($condition) || !is_array($condition)) { throw new \Exception("condition error"); } $where = array(); $variable = array(); foreach ($condition as $key => $val) { if (is_array($val)) { util::fail('更新操作暂不支持此查询方式:' . json_encode($val)); } $where[] = $key . '=:' . $key; $variable[':' . $key] = $val; } $whereString = implode(' and ', $where); $count = self::updateAll($data, $whereString, $variable); return $count; } /** * 根据主键ID查出一条记录 */ public function getById($id, $returnObject = false) { if ($returnObject == false) { return $this->conditionQuery(['id' => $id])->asArray()->one(); } else { return $this->conditionQuery(['id' => $id])->one(); } } /** *根据条件查出一条记录 */ public function getByCondition($condition, $returnObject = false, $order = false) { $query = $this->conditionQuery($condition); if (isset($order)) { $query->orderBy($order); } return $returnObject == true ? $query->one() : $query->asArray()->one(); } /** * 支持查询条件包括 * ['name'=>'john','id>'=>3,'id<'=>10,'id'=>['in',[10,11,12]],'age'=>['between',[20,30]],'name'=>['like','Jack']]; */ public function conditionQuery($condition = []) { $whereNum = 0; $query = self::find(); if (!empty($condition)) { foreach ($condition as $key => $val) { $param = [$key => $val]; if (strstr($key, '>')) { //暂不支持大于等于,等于请使用between $pos = strpos($key, '>'); $currentKey = substr($key, 0, $pos); $param = ['>', $currentKey, $val]; } elseif (strstr($key, '<')) { //暂不支持小于等于,等于请使用between $pos = strpos($key, '<'); $currentKey = substr($key, 0, $pos); $param = ['<', $currentKey, $val]; } elseif (is_array($val)) { if (count($val) != 2) { util::fail('参数不至2个,非法查询方式:' . json_encode($condition)); } if ($val[0] == 'in') { $param = ['in', $key, $val[1]]; } elseif ($val[0] == 'between') { $param = ['between', $key, $val[1][0], $val[1][1]]; } elseif ($val[0] == 'like') { $param = ['like', $key, $val[1]]; } else { util::fail('非法查询方式:' . json_encode($condition)); } } else { } if ($whereNum == 0) { $query->where($param); } else { $query->andWhere($param); } $whereNum++; } } return $query; } //是否存在数据 shish 2019. public function exists($condition) { return $this->conditionQuery($condition)->exists(); } /** *根据条件查出多条记录 */ public function getAllByCondition($condition, $order = null, $field, $indexBy = null) { $query = $this->conditionQuery($condition)->select($field); if (isset($indexBy)) { $query->indexBy($indexBy); } if (isset($order)) { $query->orderBy($order); } return $query->asArray()->all(); } /** * 根据多个主键ID查询多条记录 */ public function getByIds($ids, $order = null, $indexBy = null) { $data = []; if (empty($ids)) { return $data; } $query = $this->conditionQuery(['id' => ['in', $ids]]); if (isset($indexBy)) { $query->indexBy($indexBy); } if (!empty($order)) { $query->order($order); } $data = $query->asArray()->all(); return $data; } /** *根据条件查出数量 */ public function getCount($condition) { return $this->conditionQuery($condition)->count(); } //分页查询返回json形式 shish 2019.9.21 public function getList($field, $where, $page, $pageSize, $order = '', $with = '') { $offset = ($page - 1) * $pageSize; $query = $this->conditionQuery($where)->select($field); $clone = clone $query; $count = $clone->count(); $totalPage = ceil($count / $pageSize); $data['totalPage'] = $totalPage;//总共页数 $data['moreData'] = $totalPage > $page ? 1 : 0;//是否还有更多数据 if (!empty($order)) { $query->orderBy($order); } if (!empty($with)) { $query->with($with); } $list = $query->offset($offset)->limit($pageSize)->asArray()->all(); $data['list'] = $list;//数据 return $data; } //分页查询返回数据 shish 2019.9.21 public function getListData($field, $where, $page, $pageSize, $order = '', $with = '') { $offset = ($page - 1) * $pageSize; $query = $this->conditionQuery($where)->select($field); $cloneQuery = clone $query; $count = $cloneQuery->count(); if (!empty($order)) { $query->orderBy($order); } if (!empty($with)) { $query->with($with); } $list = $query->offset($offset)->limit($pageSize)->asArray()->all(); return ['count' => $count, 'list' => $list]; } //没有分页 public function getAllList($field, $where, $order = '', $with = '') { $query = $this->conditionQuery($where)->select($field); if (!empty($order)) { $query->orderBy($order); } if (!empty($with)) { $query->with($with); } $list = $query->asArray()->all(); return $list; } //取后台的列表与分页 shish 2019.8.18 public function getBackendList($field, $where, $page, $pageSize, $order = '', $with = '') { $offset = ($page - 1) * $pageSize; $query = $this->conditionQuery($where)->select($field); $cloneQuery = clone $query; $count = $cloneQuery->count(); if (!empty($order)) { $query->orderBy($order); } if (!empty($with)) { $query->with($with); } $pages = new Pagination(['totalCount' => $count, 'pageSize' => $pageSize]); $list = $query->offset($offset)->limit($pageSize)->asArray()->all(); return ['list' => $list, 'pages' => $pages]; } }