getModel(); $attributes = $model->attributes; $fields = array_keys($attributes); foreach ($fields as $key) { if (isset($data[$key])) { $model->$key = $data[$key]; } } if (!$model->validate()) { // 验证失败: $errors 是一个包含错误信息的数组 \Yii::error(static::tableName() . ' -- model validate errors: ' . json_encode($model->errors)); util::fail('输入数据验证失败'); } // 保存数据并检查结果 if (!$model->save()) { $errors = $model->errors; \Yii::error(static::tableName() . ' -- save failed: ' . json_encode($errors)); throw new \Exception('数据保存失败: ' . json_encode($errors)); } return $returnObject ? $model : $model->attributes; // 原有实现无异常处理 // $model->save(); // if ($returnObject) { // return $model; // } // return $model->attributes; } /** * 批量添加 */ public function batchAdd($data) { $model = $this->getModel(); foreach ($data as $attributes) { $newModel = clone $model; // false 不检测字段安全 true 需要在model设置rules $newModel->setAttributes($attributes, false); $newModel->save(); } } /** * 取表的字段 */ public function getFields() { $model = $this->getModel(); $attributes = $model->attributes; return array_keys($attributes); } /** * 根据主键ID删除一条记录 * @param $id * @return int|false the number of rows deleted, or `false` if the deletion is unsuccessful for some reason. * @throws \Throwable * @throws \yii\db\StaleObjectException */ public function deleteById($id) { $model = $this->getModel(); return $model::findOne($id)->delete(); } /** * 根据id批量删 ssh 2019.12.7 * @param $ids * @return int the number of rows deleted */ public function deleteByIds($ids) { $model = $this->getModel(); return $model::deleteAll(['id' => $ids]); } /** * 根据条件删除一条或多条记录 * @param $condition * @return int */ 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]; } //多个主键更新 ssh 2019.9.3 public function updateByIds($ids, $data) { return self::updateAll($data, ['id' => $ids]); } /** * 根据条件更新一条或多条记录 */ public function updateByCondition($condition, $data) { $where = array(); $variable = array(); foreach ($condition as $key => $val) { $where[] = $key . '=:' . $key; $variable[':' . $key] = $val; } $whereString = implode(' and ', $where); $count = self::updateAll($data, $whereString, $variable); return $count; } /** * 根据主键ID查出一条记录 * @param $id * @param bool $returnObject * @param string $field * @return array|ActiveRecord|null */ public function getById($id, $returnObject = false, $field = '*') { $query = $this->conditionQuery(['id' => $id])->select($field); if ($returnObject == false) { return $query->asArray()->one(); } else { return $query->one(); } } /** * 根据条件查出一条记录 * @param $condition * @param bool $returnObject * @param bool $order * @param string $field * @return array|ActiveRecord|null */ public function getByCondition($condition, $returnObject = false, $order = false, $field = '*') { $query = $this->conditionQuery($condition)->select($field); if (isset($order)) { $query->orderBy($order); } return $returnObject == true ? $query->one() : $query->asArray()->one(); } //随机取一个 ssh 2020.2.10 public function getOne($returnObject = false, $order = false, $field = '*') { $query = $this->conditionQuery([])->select($field); if (isset($order)) { $query->orderBy($order); } return $returnObject == true ? $query->one() : $query->asArray()->one(); } /** * 支持查询条件包括 $condition = [ 'name' => 'john', // 等于 'id>' => 3, // 大于 'id<' => 10, // 小于 'id!=' => -1, // 不等于 'id' => ['in', [10,11,12]], // IN 'age' => ['between', [20,30]], // BETWEEN 'name' => ['like', 'Jack'] // LIKE ]; */ public function conditionQuery($condition = []) { $whereNum = 0; $query = self::find(); if (!empty($condition)) { foreach ($condition as $key => $val) { $param = [$key => $val]; if (strstr($key, '!=')) { //不等于 $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 (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; } /** * 是否存在数据 * @param $condition * @return bool */ public function exists($condition) { return $this->conditionQuery($condition)->exists(); } /** *根据条件查出多条记录 */ public function getAllByCondition($condition, $order = null, $field, $indexBy = null, $returnObject = false) { $query = $this->conditionQuery($condition)->select($field); if (isset($indexBy)) { $query->indexBy($indexBy); } if (isset($order)) { $query->orderBy($order); } if ($returnObject == false) { return $query->asArray()->all(); } else { return $query->all(); } } /** * 根据多个主键ID查询多条记录 */ public function getByIds($ids, $order = null, $indexBy = null, $field = '*') { $data = []; if (empty($ids)) { return $data; } $query = $this->conditionQuery(['id' => ['in', $ids]])->select($field); 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(); } //分页查询 ssh 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['totalNum'] = $count; $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; } //查询全部 ssh 2019.11.27 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; } //查询指定条数 ssh 2019.11.30 public function getLimitList($field, $where, $limit, $order = '', $with = '') { $offset = 0; $query = $this->conditionQuery($where)->select($field); if (!empty($order)) { $query->orderBy($order); } if (!empty($with)) { $query->with($with); } $list = $query->offset($offset)->limit($limit)->asArray()->all(); return $list; } /** * 计数器+1-1 * $counters = ['num' => 1] 1数量+1 -1数量-1 * $condition = ['id' => $id] */ public function counters($counters, $condition, $params = []) { return self::updateAllCounters($counters, $condition, $params); } // 获取图书的作者 public function getAuthor() { //同样第一个参数指定关联的子表模型类名 return $this->hasOne(Author::className(), ['id' => 'author_id']); } //根据主键获取被销的信息 ssh 2021.5.18 public function getLockById($id, $field = '*') { return self::findBySql('select ' . $field . ' from ' . static::tableName() . ' where id = :id for update', ['id' => $id])->one(); } //求和 public function sum($condition, $field) { return $this->conditionQuery($condition)->sum($field); } }