oDog->_setDogName("hub"); // 必须,me用,option用 // $this->oDog->_setPrimaryKey("id"); // 可选,默认id // $this->oDog->_setStrField(["content"]); // 可选,指定长文本字段 // $this->oDog->_setInFormat(["type"]); // 可选,zero^int,^date,^dateFull // $this->oDog->_setOutFormat(["time" => "date"]); // 可选,date,dateFull class Dog extends Mod\Base { public $oModelSelf; public $sPrimaryKey = "id"; public $iStrMaxLen; public $aStrField = []; public $aInFormat = []; public $aOutFormat = []; public $sDogName; private $aMsg = []; public function __construct($oModelSelf = false) { $this->_setModel($oModelSelf); } //// 定义系列 public function _setStrMaxLen($iStrMaxLen) { $this->iStrMaxLen = $iStrMaxLen; } public function _setStrField($aStrField) { $this->iStrMaxLen = ModelDogOption::_hit($this->sDogName, "str_len_max"); if (!$this->iStrMaxLen) { // throw new \Exception("需要设置dog的option的str_len_max"); $this->iStrMaxLen = 60; $this->aMsg["警告882"] = "需要设置dog的option的str_len_max,临时设为60。"; } $this->aStrField = $aStrField; } public function _setDogName($sDogName) { $this->sDogName = $sDogName; } public function _setModel($oModelSelf) { $this->oModelSelf = $oModelSelf; } public function _setPrimaryKey($key) { $this->sPrimaryKey = $key; } public function _setInFormat($aInFormat) { $this->aInFormat = $aInFormat; } public function _setOutFormat($aOutFormat) { $this->aOutFormat = $aOutFormat; } // public function _setFormatField($aFormatField) // { // $this->aFormatField = $aFormatField; // } //// 定义系列 end //// option 系列 public function option($aParam) { $aOption = ModelDogOption::_list($this->sDogName); return $this->toJson($aOption); } public function optionAdd($aParam) { $k = $aParam["aArg"][1] ?? false; $v = $aParam["aArg"][2] ?? false; if ($k == "?") { return "#optionAdd {k} {v}"; } if (!$k) { return "需要k"; } if (!$v) { return "需要v"; } $oOption = new ModelDogOption(); $oOption->dog_name = $this->sDogName; $oOption->k = $k; $oOption->v = $v; $oOption->save(); return $this->toJson(ModelDogOption::_filter($oOption)); } public function optionSet($aParam) { $k = $aParam["aOption"][1] ?? false; $v = $aParam["aArg"][1] ?? false; if ($v == "?") { return "#optionSet__{k} {v}"; } if (!$k) { return "需要k"; } if (!$v) { return "需要v"; } $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first(); if (!$oOption) { return "没找到这个"; } $oOption->v = $v; $oOption->save(); return $this->toJson(ModelDogOption::_filter($oOption)); } public function optionDel($aParam) { $k = $aParam["aArg"][1] ?? false; $is_done = $aParam["is_done"] ?? false; if ($k == "?") { return "#optionDel {k}"; } if (!$k) { return "需要k"; } $oOption = ModelDogOption::where("dog_name", $this->sDogName)->where("k", $k)->first(); if (!$oOption) { return "没找到这个"; } if ($is_done === false) { $sMsg = "匹配以下,确认用optionDelDone()。"; $sOption = $this->toJson($oOption); return $sMsg."\n\n".$sOption; } else if ($is_done === true) { $r = $oOption->delete(); return $r; } } public function optionDelDone($aParam) { $aParam["is_done"] = true; return $this->optionDel($aParam); } //// option 系列 end //// 辅助系列 private function filterList($oSelfList) { foreach ($oSelfList as &$oSelfListRow) { $oSelfListRow = $this->filterRow($oSelfListRow); } return $oSelfList; } private function meToStr_list($oMe) { $str = ""; $i = 0; foreach ($oMe as $oMeRow) { if ($i !== 0) { $str .= "\n\n"; } $str .= $this->meToStr($oMeRow); $i++; } return $str; } private function meToStr($oMe) { $str = $oMe->id.":".$oMe->rag; return $str; } //// 辅助系列 end //// json系列 // private function //// json系列end //// me系列 public function me() { $oMe = ModelMe::where("class", $this->sDogName)->first(); if (!$oMe) { return "空"; } return $oMe->rag; } public function meEdit($aParam) { $aValue = $aParam["aArg"] ?? false; $sValue = implode(" ", $aValue); if ($sValue == "?") { return "/meEdit {value}"; } $aWhere = [ "class" => $this->sDogName, ]; $aValue = [ "rag" => $sValue, ]; $oMe = ModelMe::updateOrCreate($aWhere, $aValue); return $this->me(); } //// me系列 end private function filterRow($oSelfRow) { foreach ($this->aStrField as $v) { $oSelfRow->{$v} = $this->subStr($oSelfRow->{$v}); } return $oSelfRow; } private function subStr($input) { if (!$input) { return $input; } if (mb_strlen($input, 'UTF-8') > (int) $this->iStrMaxLen) { return mb_substr($input, 0, (int) $this->iStrMaxLen, 'UTF-8')."……"; } return $input; } public function list($aParam) { return $this->page($aParam); } public function limit($aParam) { if (($aParam["aArg"][1] ?? false) == "?") { return "#limit {skip} {take}"; } $iSkip = $aParam["aArg"][1] ?? 0; $iTake = $aParam["aArg"][2] ?? false; if (!$iTake) { $iTake = ModelOption::_hit("dog_limit"); } if (!$iTake) { return "需要option表里的dog_limit"; } $oSelf = $this->oModelSelf->skip($iSkip)->take($iTake)->get(); return $this->toJson($oSelf); } public function page($aParam) { $iPage = $aParam["aArg"][1] ?? 1; $aParam = []; $aParam["aOption"][2] = $iPage; return $this->find($aParam); } public function add($aParam) { $sField = $aParam["aOption"][1] ?? false; $sValue = $aParam["aArg"][1] ?? false; if ($sValue == "?") { return "#add__{field} {value}"; } if (!$sValue) { return "需要value"; } if (!$sField) { return "需要field"; } $this->oModelSelf->$sField = $sValue; $this->oModelSelf->save(); $aParam = []; $aParam["aOption"][1] = $this->sPrimaryKey; $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey}; return $this->find($aParam); } public function like($aParam) { $aParam["is_like"] = true; return $this->find($aParam); } public function clone($aParam) { $sValue = $aParam['aArg'][1] ?? false; // $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; $sKeyType = $aParam["aOption"][1] ?? "int"; if ($sValue == "?") { return "#clone__{keyType?int:int,str,int自增str随机} {whereValue}"; } if (!$sValue) { return "需要value"; } // 查找文章 $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sValue)->first(); if (!$oModelSelf) { return "没找到这个"; } $oModelSelfNew = $oModelSelf->replicate(); if ($sKeyType == "str") { $oModelSelfNew->code = $oModelSelfNew->{$this->sPrimaryKey}."-clone".rand(0, 9999); } $oModelSelfNew->save(); $aParam = []; $aParam["aArg"][1] = $oModelSelfNew->{$this->sPrimaryKey}; return $this->find($aParam); } private function _getLimit() { $iLimit = ModelDogOption::_hit($this->sDogName, "limit"); if (!$iLimit) { $iLimit = ModelOption::_hit("dog_limit"); } if (!$iLimit) { // throw new \Exception("需要option里的dog_limit"); $iLimit = 30; $this->aMsg["警告881"] = "需要option里的dog_limit,临时设为30。"; } return $iLimit; } public function find($aParam) { $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey; $sValue = $aParam["aArg"][1] ?? false; $iPage = $aParam["aOption"][2] ?? 1; $isLike = $aParam["is_like"] ?? false; $sHitField = $aParam["sHitField"] ?? false; if ($sValue == "?") { return "#find__{field?primaryKey}__{page?1} {value?all}"; } $iLimit = $this->_getLimit(); if ($sValue === false ) { $oSelf = $this->oModelSelf; } else if ($isLike === true) { $oSelf = $this->oModelSelf->where($sField, "like", "%".$sValue."%"); } else { $oSelf = $this->oModelSelf->where($sField, $sValue); } $oSelf = $oSelf->paginate($iLimit, ['*'], 'page', $iPage); if ($oSelf->isEmpty()) { return "没找到这个"; } // hit必然单体 if ($sHitField) { return $oSelf->items()[0]->$sHitField; } $aData = $this->toDataList($oSelf); return $this->toJson($aData); } private function toDataList($oSelf) { $aSelf = $oSelf->toArray(); $aMsg = []; // 说明是分页 if (isset($aSelf["data"])) { $aData = $aSelf["data"]; } else { $aData = $aSelf; } $iCount = $aSelf["total"] ?? 0; $iPagePer = $aSelf["per_page"] ?? 0; $iPage = $aSelf["current_page"] ?? 0; $iPageTotal = $aSelf["last_page"] ?? 0; if ($iPageTotal > 1) { if ($iPage) { $this->aMsg["页"]["页当前"] = $iPage; } if ($iPageTotal) { $this->aMsg["页"]["页总数"] = $iPageTotal; } if ($iPagePer) { $this->aMsg["页"]["行每页"] = $iPagePer; } if ($iCount) { $this->aMsg["页"]["行总数"] = $iCount; } } $aData = $this->filterDataList($aData); // $aData = $this->dataInsterMsgList($aData); return $aData; } public function toJson($aData) { if ($this->aMsg && !is_string($aData)) { if (is_object($aData)) { $aData = $aData->toArray(); } array_unshift($aData, $this->aMsg); } return parent::toJson($aData); } private function dataInsterMsgList($aData, $aMsg) { if ($aMsg) { array_unshift($aData, $aMsg); } return $aData; } private function dataInsterMsg($aData, $aMsg) { $aDataNew = []; if ($aMsg) { $aDataNew[] = $aMsg; $aDataNew[] = $aData; } else { $aDataNew = $aData; } return $aDataNew; } private function toData($oSelf) { if (!is_array($oSelf)) { $aData = $oSelf->toArray(); } else { $aData = $oSelf; } $aData = $this->filterData($aData); return $aData; } private function filterDataList($aData) { foreach ($aData as &$aDataRow) { $aDataRow = $this->filterData($aDataRow); } return $aData; } private function filterData($aData) { foreach ($this->aStrField as $sStrField) { $aData[$sStrField] = $this->subStr($aData[$sStrField]); } foreach ($this->aOutFormat as $sFormatField => $sFormatType) { if ($sFormatType == "date") { $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); } else if ($sFormatType == "dateFull") { $aData[$sFormatField] = date("Y-m-d", (int) $aData[$sFormatField]); } } return $aData; } public function kv($aParam) { $k = $aParam["aOption"][1] ?? false; $v = $aParam["aArg"][1] ?? false; if ($v == "?") { return "#kv__{k} {v}"; } $aParam = []; $aParam["aOption"][1] = $k; $aParam["aOption"][2] = "v"; $aParam["aArg"][1] = $v; return $this->set($aParam); } public function jsonAdd($aParam) { if (($aParam["aArg"][1] ?? false) == "?") { return "#jsonAdd {json}"; } $aJson = $aParam["aArg"] ?? false; $sJson = implode(" ", $aJson); if (!$sJson) { return "需要json"; } $aJson = json_decode($sJson, true); foreach ($aJson as $k => $v) { $this->oModelSelf->$k = $v; } $this->oModelSelf->save(); $aParam = []; $aParam["aArg"][1] = $this->oModelSelf->{$this->sPrimaryKey}; return $this->find($aParam); } public function jsonSet($aParam) { $sWhereValue = $aParam["aOption"][1] ?? false; $aJson = $aParam["aArg"] ?? false; $sJson = implode(" ", $aJson); if ($sJson == "?") { return "#setJson__{whereValue} {json} | 绑定主键 单体"; } if (!$sWhereValue) { return "需要whereValue"; } if (!$sJson) { return "需要json"; } $oModelSelf = $this->oModelSelf->where($this->sPrimaryKey, $sWhereValue)->first(); if (!$oModelSelf) { return "没找到这个"; } $aJson = json_decode($sJson, true); foreach ($aJson as $k => $v) { $v = $this->inFormat($k, $v); $oModelSelf->$k = $v; } $oModelSelf->save(); $aParam = []; $aParam["aArg"][1] = $oModelSelf->{$this->sPrimaryKey}; return $this->find($aParam); } public function jsonGet($aParam) { $sWhereValue = $aParam["aArg"][1] ?? false; $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; if ($sWhereValue == "?") { return "#jsonGet__{whereFile?primary} {whereValue}"; } if (!$sWhereValue) { return "需要whereValue"; } $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->first(); if (!$oSelf) { return "没找到这个"; } return $this->toJson($oSelf); } public function likeSet($aParam) { if (($aParam["aArg"][1] ?? false) == "?") { return "原set走like匹配,慎用"; } $aParam["is_like"] = true; return $this->set($aParam); } public function likeSetDone($aParam) { if (($aParam["aArg"][1] ?? false) == "?") { return "原set走like匹配,慎用"; } $aParam["is_like"] = true; $aParam["is_like_done"] = true; return $this->set($aParam); } public function set($aParam) { $sSetValue = $aParam["aArg"] ?? false; $sSetValue = implode(" ", $sSetValue); $bIsLike = $aParam["is_like"] ?? false; $bIsLikeDone = $aParam["is_like_done"] ?? false; if ($sSetValue == "?") { $tmp = "#set__{whereField}__{WhereValue}__{setField} {setValue} | 多条"; $tmp .= "\n\n"; $tmp .= "#set__{whereValue}__{setField} {setValue} | 主键"; return $tmp; } // 有第三参数说明是findSet模式 if (isset($aParam["aOption"][3])) { $sWhereField = $aParam["aOption"][1] ?? false; $sWhereValue = $aParam["aOption"][2] ?? false; $sSetField = $aParam["aOption"][3] ?? false; $sMod = "findSet"; } else { $sWhereField = $this->sPrimaryKey; $sWhereValue = $aParam["aOption"][1] ?? false; $sSetField = $aParam["aOption"][2] ?? false; $sMod = "set"; } if (!$sWhereField) { return "需要whereField"; } if (!$sWhereValue) { return "需要whereValue"; } if (!$sSetField) { return "需要setField"; } if ($bIsLike === false) { $oSelf = $this->oModelSelf->where($sWhereField, $sWhereValue)->get(); } else if ($bIsLike === true) { $oSelf = $this->oModelSelf->where($sWhereField, "like", "%".$sWhereValue."%")->get(); if ($bIsLikeDone === false) { $sMsg = "匹配以下数据,确认修改用likeSetDone()。"; $sSelfStr = $this->toJson($oSelf); return $sMsg."\n\n".$sSelfStr; } } else { return "??????????????"; } if ($oSelf->isEmpty()) { return "没找到这个"; } $sSetValue = $this->inFormat($sSetField, $sSetValue); $i = 0; foreach ($oSelf as $oSelfRow) { $oSelfRow->$sSetField = $sSetValue; $oSelfRow->save(); $i++; } if ($i == 1) { $aParam = []; $aParam["aOption"][1] = $this->sPrimaryKey; $aParam["aArg"][1] = $oSelfRow->{$this->sPrimaryKey}; return $this->find($aParam); } return "影响".$i."条数据"; } private function inFormat($sSetField, $sSetValue) { if (in_array($sSetField, $this->aInFormat)) { $sSetValue = $this->mapInFormat($sSetValue); } return $sSetValue; } private function mapInFormat($sValue) { $aValue = explode("^", $sValue, 2); if (!isset($aValue[1])) { return $sValue; } $sValueQian = $aValue[0]; $sValueHou = $aValue[1]; if ($sValueHou == "int") { if ($sValueQian == "zero") { $sValueQian = 0; } } else if ($sValueHou == "dayToDate") { $sValueQian = date("Y-m-d H:i:s", strtotime("+{$sValueQian} days")); } return $sValueQian; } public function delDone($aParam) { $aParam["is_done"] = true; return $this->del($aParam); } public function del($aParam) { $sField = $aParam["aOption"][1] ?? $this->sPrimaryKey; $sValue = $aParam["aArg"][1] ?? false; $bIsDone = $aParam["is_done"] ?? false; if ($sValue == "?") { return "#del__{field?默认primaryKey} {value}"; } $oSelf = $this->oModelSelf->where($sField, $sValue)->get(); if ($oSelf->isEmpty()) { return "没找到这个"; } if ($bIsDone == true) { $i = 0; foreach ($oSelf as $oSelfRow) { $ii = $oSelfRow->delete(); $i = $i + $ii; } return "删除".$i."条数据"; } $sMsg = "匹配以下数据,确认删除使用delDone()。\n\n"; $sStr = $this->toJson($oSelf); return $sMsg.$sStr; } public function hit($aParam) { $sHitField = $aParam["aOption"][1] ?? false; $sWhereField = $aParam["aOption"][2] ?? $this->sPrimaryKey; $sWhereValue = $aParam["aArg"][1] ?? false; if ($sWhereValue == "?") { return "#hit__{hitField}__{whereField?primaryKey} {whereValue}"; } if (!$sWhereValue) { return "需要value"; } $aParam = []; $aParam["sHitField"] = $sHitField; $aParam["aOption"][1] = $sWhereField; $aParam["aArg"][1] = $sWhereValue; return $this->find($aParam); } public function content($aParam) { $sWhereField = $aParam["aOption"][1] ?? $this->sPrimaryKey; $sValue = $aParam["aArg"][1] ?? false; if ($sValue == "?") { return "#content__{whereField?primaryKey} {whereValue}"; } if (!$sValue) { return "需要value"; } $aParam = []; $aParam["aOption"][1] = "content"; $aParam["aOption"][2] = $sWhereField; $aParam["aArg"][1] = $sValue; return $this->hit($aParam); } public function table() { $sTable = $this->oModelSelf->getTable(); $columns = \DB::select("SHOW CREATE TABLE `{$sTable}`"); return $columns[0]->{"Create Table"}; } }