复杂查询¶
此外还可以直接使用sql语句进行查询,以此项目为例子:
访问/users接口,使用cakephp本身的复杂查询方式结果是这样的:
1 | {"code":200,"status":"success","body":[{"id":1,"loginId":"test","phone":"1234567890123","name":"123","avatar":null,"lastLoginTime":null,"mustChangePassword":null,"status":1,"remarks":null,"addresses":[{"id":1,"userId":1,"address":"1","areas":[{"id":1000,"parentId":null,"name":"江苏省","children":[]}]}],"roles":[{"id":1,"name":"默认","status":0,"remarks":null,"permissions":[{"id":1200,"parentId":1000,"code":"menu-info-company","name":"","method":"GET","url":null,"remarks":null},{"id":1120,"parentId":1100,"code":"info-carrier-user-edit","name":"","method":"POST","url":null,"remarks":null},{"id":1220,"parentId":1200,"code":"info-company-user-edit","name":"","method":"POST","url":null,"remarks":null},{"id":1210,"parentId":1200,"code":"info-company-edit","name":"","method":"POST","url":null,"remarks":null},{"id":1000,"parentId":null,"code":"menu-info","name":"","method":"","url":null,"remarks":null},{"id":1110,"parentId":1100,"code":"info-carrier-edit","name":"","method":"POST","url":null,"remarks":null},{"id":1100,"parentId":1000,"code":"menu-info-carrier","name":"","method":"GET","url":null,"remarks":null},{"id":1300,"parentId":1000,"code":"menu-info-company-migrate","name":"","method":"GET","url":null,"remarks":null},{"id":1230,"parentId":1200,"code":"companies-declare-edit","name":"","method":"POST","url":null,"remarks":null}]}]}]} |
把这个修改为直接使用sql进行查询
修改src/Model/Logic/UsersLogic.php中的findAll方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public function findAll() { $conn = $this->usersTable->getConnection(); // 获取数据库连接 // 直接执行sql然后取得结果 $res = $conn->execute(' SELECT users.*, (select string_agg(permission_id||\'\' , \',\') from roles_permissions) as permissions, (select string_agg(areas.name||\'\' , \',\') from areas) as areas FROM users LEFT JOIN users_roles ON users."id" = users_roles.user_id LEFT JOIN roles ON users_roles.role_id = roles."id" LEFT JOIN roles_permissions ON roles."id" = roles_permissions.role_id LEFT JOIN addresses ON users."id" = addresses.user_id LEFT JOIN addresses_areas ON addresses."id" = addresses_areas.address_id LEFT JOIN areas on areas."id" = addresses_areas.area_id GROUP BY users.id') ->fetchAll('assoc'); return $this->underscoreToCamel($res); } |
访问api的结果:
1 | {"code":200,"status":"success","body":[{"id":1,"loginId":"test","phone":"1234567890123","password":"123456","name":"123","avatar":null,"lastLoginTime":null,"mustChangePassword":null,"status":1,"createdBy":null,"createdTime":null,"modifiedBy":null,"modifiedTime":null,"remarks":null,"permissions":"1200,1120,1220,1210,1000,1110,1100,1210,1300,1000,1300,1230,1230,1300,1220,1100,1120,1200,1100,1110,1230,1000,1220,1120,1110,1210,1200","areas":"江苏省,常州市,新北区,武进区"}]} |
这种方式由于sql本身的限制无法让一条数据中包含数组的内容,所以两种方式的结果会不一样
但是如果有情况需要很复杂的查询时,可以直接用sql来处理会简单很多