shipengfei

Update lumen_rule_model.md

1 -## LUMEN+API Model规范 1 +## LUMEN+API Model规范
2 - 2 +
3 - 3 +
4 -### 1. Model规范 4 +### 1. Model规范
5 - 5 +
6 -* 使用Model实现数据业务处理,包括数据表和数据关联表的增删改查。 6 +* 使用Model实现数据业务处理,包括数据表和数据关联表的增删改查。
7 - 7 +
8 -* 对于各个表的Model, 继承自定义的BaseModel类,而不是Model类 8 +* 对于各个表的Model, 继承自定义的BaseModel类,而不是Model类
9 - 9 +
10 -* 如果表和表之间有一定的关系,1vs1, 1vsN,那在Model中使用hasOne,belongsTo进行映射,通过这样的映射,可以对Model对象实现很清晰的操作逻辑: 10 +* 如果表和表之间有一定的关系,1vs1, 1vsN,那在Model中使用hasOne,belongsTo进行映射,通过这样的映射,可以对Model对象实现很清晰的操作逻辑:
11 - 11 +
12 - ```php 12 +```php
13 - class GroupModel extends BaseModel { 13 +class GroupModel extends BaseModel {
14 - 14 +
15 - /** 15 + /**
16 - * @return GroupModel 16 + * @return GroupModel
17 - */ 17 + */
18 - public function getInstanceByGroupCode($code) { 18 + public function getInstanceByGroupCode($code) {
19 - return $this->where('group_code',$code)->first(); 19 + return $this->where('group_code',$code)->first();
20 - } 20 + }
21 - 21 +
22 - public function weixinGroupInfo() { 22 + public function weixinGroupInfo() {
23 - return $this->hasOne(WeixinGroupInfo::class,'group_id','group_id'); 23 + return $this->hasOne(WeixinGroupInfo::class,'group_id','group_id');
24 - } 24 + }
25 - 25 +
26 - /** 26 + /**
27 - * @return WeixinGroupInfo 27 + * @return WeixinGroupInfo
28 - */ 28 + */
29 - public function myWeixinGroupInfo() { 29 + public function myWeixinGroupInfo() {
30 - return $this->weixinGroupInfo()->first(); 30 + return $this->weixinGroupInfo()->first();
31 - } 31 + }
32 - 32 +
33 - public funciton groupSites() { 33 +public funciton groupSites() {
34 - return $this->hasMany(GroupSite::class,'group_id','group_id'); 34 + return $this->hasMany(GroupSite::class,'group_id','group_id');
35 - } 35 +}
36 - 36 +
37 - /** 37 +/**
38 - * @return Collection 38 + * @return Collection
39 - */ 39 + */
40 - public function myGroupSites() { 40 +public function myGroupSites() {
41 - return $this->groupSites->get(); 41 + return $this->groupSites->get();
42 - } 42 +}
43 - 43 +
44 - public function getMyGroupName() { 44 +public function getMyGroupName() {
45 - return isset($this->group_name) ? $this->group_name : null; 45 + return isset($this->group_name) ? $this->group_name : null;
46 - } 46 +}
47 - } 47 +}
48 - 48 +
49 - $groupInstance = (new GroupModel())->getInstanceByGroupCode('Foo'); 49 +$groupInstance = (new GroupModel())->getInstanceByGroupCode('Foo');
50 - $groupWeixinInfoInstance = $groupInstance->myWeixinGroupInfo(); 50 +$groupWeixinInfoInstance = $groupInstance->myWeixinGroupInfo();
51 - $groupSites = $groupInstance->myGroupSites()->filter( function($site) {/**/ }); 51 +$groupSites = $groupInstance->myGroupSites()->filter( function($site) {/**/ });
52 - 52 +
53 - 53 +
54 - ``` 54 +```
55 - 55 +
56 -* Model必须实现数据表的增删改操作,不能让这些操作暴露在Controller或者Service中 56 +* Model必须实现数据表的增删改操作,不能让这些操作暴露在Controller或者Service中
57 - 57 +
58 - ```php 58 +```php
59 - class UserModel extends BasicModel 59 +class UserModel extends BasicModel
60 - { 60 +{
61 - public function insertUser(array $userInfo) { /**/ } 61 + public function insertUser(array $userInfo) { /**/ }
62 - public function updateUser(array $userInfo) { /**/ } 62 + public function updateUser(array $userInfo) { /**/ }
63 - /* 如有必要,更新字段的操作颗粒度可以降底到每一项 */ 63 + /* 如有必要,更新字段的操作颗粒度可以降底到每一项 */
64 - public function updateUserLoginName ($userId,$userName) {/**/} 64 + public function updateUserLoginName ($userId,$userName) {/**/}
65 - public function deleteUserById($userId) {/**/} 65 + public function deleteUserById($userId) {/**/}
66 - } 66 +}
67 - ``` 67 +```
68 - 68 +
69 -* Model层函数的返回,都要写明注释(尤其是参数和返回值类型),以便Controller调用时,可以智能感知和减少错误发生的机率。 69 +* Model层函数的返回,都要写明注释(尤其是参数和返回值类型),以便Controller调用时,可以智能感知和减少错误发生的机率。
70 - 70 +
71 - ```php 71 +```php
72 - /** 72 +/**
73 - * 增加一个新的用户,成功的情况下,返回用户对象 73 +* 增加一个新的用户,成功的情况下,返回用户对象
74 - * @param array userInfo 74 +* @param array userInfo
75 - * ['userName','userSex','userDesc'] 75 +* ['userName','userSex','userDesc']
76 - * @result App\Models\User 76 +* @result App\Models\User
77 - */ 77 +*/
78 - public function insertUser(array $userInfo) { 78 +public function insertUser(array $userInfo) {
79 - $this->arrValidation($userInfo, [ 79 + $this->arrValidation($userInfo, [
80 - 'userName' => 'required|string|min:6' 80 + 'userName' => 'required|string|min:6'
81 - ]); 81 + ]);
82 - $newUser = new User(); 82 + $newUser = new User();
83 - $newUser->user_name = userInfo['userName']; 83 + $newUser->user_name = userInfo['userName'];
84 - $newUser->user_sex = isset($userInof['userSex']) ? $userInfo['userSex'] : GlobalSystem::MALE; 84 + $newUser->user_sex = isset($userInof['userSex']) ? $userInfo['userSex'] : GlobalSystem::MALE;
85 - $newUser->user_desc = isset($userInof['userDesc']) ? $userInfo['userDesc'] : ''; 85 + $newUser->user_desc = isset($userInof['userDesc']) ? $userInfo['userDesc'] : '';
86 - 86 +
87 - $newUser->save(); 87 + $newUser->save();
88 - 88 +
89 - return $newUser; 89 + return $newUser;
90 - } 90 +}
91 - ``` 91 +```
92 - 92 +
93 -* 不要使用scope类型的函数。 93 +* 不要使用scope类型的函数。
94 - 94 +
95 -* 在函数上区分并辩明属于Model的方法和属于Instance的方法。 95 +* 在函数上区分并辩明属于Model的方法和属于Instance的方法。
96 - 96 +
97 - > 所谓Model方法,是指new一个Model实例即可调用的方法,对于操作库,可以使用Model方法 97 + > 所谓Model方法,是指new一个Model实例即可调用的方法,对于操作库,可以使用Model方法
98 > 98 >
99 - > 所谓Instance方法,是指对应的数据表中的一个实例,例如,通过User::find(1)即可获得一个Instance方法。 99 + > 所谓Instance方法,是指对应的数据表中的一个实例,例如,通过User::find(1)即可获得一个Instance方法。
100 > 100 >
101 - > Instance方法一般用来获得属性,实现实例的业务逻辑,操作与此实例关联的其它数据模型的实例。 101 + > Instance方法一般用来获得属性,实现实例的业务逻辑,操作与此实例关联的其它数据模型的实例。
102 > 102 >
103 - > 一般来说,在Instance方法上,加一个My修饰词进行表示。 103 + > 一般来说,在Instance方法上,加一个My修饰词进行表示。
104 - 104 +
105 - ```php 105 +```php
106 - public function insertUser(array $userInfo); // Model方法 106 +public function insertUser(array $userInfo); // Model方法
107 - public function getMyUserName() { return $this->user_name; } // Instance方法 107 +public function getMyUserName() { return $this->user_name; } // Instance方法
108 - public function checkMyRoles() { /**/ } 108 +public function checkMyRoles() { /**/ }
109 - ``` 109 +```
110 - 110 +
111 -* 在Model层所实现的业务逻辑上,要把业务边界分清楚,比如对于Group/Site这样的业务来说,Group可以代理Site的一些操作,但是具体涉及到Site数据操作,需要交给Site模型进行。 111 +* 在Model层所实现的业务逻辑上,要把业务边界分清楚,比如对于Group/Site这样的业务来说,Group可以代理Site的一些操作,但是具体涉及到Site数据操作,需要交给Site模型进行。
112 - 112 +
113 - ```php 113 +```php
114 - class Group extends BaseModel 114 +class Group extends BaseModel
115 - { 115 +{
116 - /* 假设groupInfo中涵盖了site的信息 */ 116 + /* 假设groupInfo中涵盖了site的信息 */
117 - public function receiveGroupInfoEvent($groupInfo) { 117 + public function receiveGroupInfoEvent($groupInfo) {
118 - $this->updateGroup($groupInfo); 118 + $this->updateGroup($groupInfo);
119 - if(isset($groupInfo['sites'])) { 119 + if(isset($groupInfo['sites'])) {
120 - $this->updateGroupSites($groupInfo['sites']); 120 + $this->updateGroupSites($groupInfo['sites']);
121 - } 121 + }
122 - } 122 + }
123 - 123 +
124 - public function updateGroup($groupInfo) { 124 + public function updateGroup($groupInfo) {
125 - // do group update 125 + // do group update
126 - } 126 + }
127 - 127 +
128 - public function updateGroupSites($siteList) { 128 + public function updateGroupSites($siteList) {
129 - foreach($siteList as $siteInfo) 129 + foreach($siteList as $siteInfo)
130 - (new Site())->updateSite($siteInfo); 130 + (new Site())->updateSite($siteInfo);
131 - } 131 + }
132 - } 132 +}
133 - ``` 133 +```
134 - 134 +
135 -* BaseModel的一些基本操作 135 +* BaseModel的一些基本操作
136 - 136 +
137 - | 索引 | 函数方法 | 备注 | 137 +| 索引 | 函数方法 | 备注 |
138 - | ---- | ----------------------- | ---------------------------------------- | 138 +| ---- | ----------------------- | ---------------------------------------- |
139 - | 1 | getInstanceById | Model方法,根据关键字获得Instance对象 | 139 +| 1 | getInstanceById | Model方法,根据关键字获得Instance对象 |
140 - | 2 | getMyId | Instance方法,获得主ID | 140 +| 2 | getMyId | Instance方法,获得主ID |
141 - | 3 | getTable | Model方法,获得数据表名称 | 141 +| 3 | getTable | Model方法,获得数据表名称 |
142 - | 4 | toSql | Model方法,查询时可以将其转换为SQL语句 | 142 +| 4 | toSql | Model方法,查询时可以将其转换为SQL语句 |
143 - | 5 | getQueryByConditions | Model方法,基础的条件查询,一些场合下可以代替where语句 | 143 +| 5 | getQueryByConditions | Model方法,基础的条件查询,一些场合下可以代替where语句 |
144 - | 6 | checkValidItem | Model方法,查询符合条件的数据有多少项 | 144 +| 6 | checkValidItem | Model方法,查询符合条件的数据有多少项 |
145 - | 7 | updateItemsByPrimaryId | Model方法,根据ID更新数据表项 | 145 +| 7 | updateItemsByPrimaryId | Model方法,根据ID更新数据表项 |
146 - | 8 | updateItemsByConditions | Model方法,根据条件更新数据表项 | 146 +| 8 | updateItemsByConditions | Model方法,根据条件更新数据表项 |
147 - | 9 | checkObjectIdExist | Instance方法,检查调用实例是否Instance对象,如果不是,则抛出异常 | 147 +| 9 | checkObjectIdExist | Instance方法,检查调用实例是否Instance对象,如果不是,则抛出异常 |
148 - 148 +
149 - ? 149 +
150 150
......