You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuDataAccess.php 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace Luticate\Utils\DataAccess;
  3. use Illuminate\Database\Capsule\Manager as Capsule;
  4. use Illuminate\Database\Connection;
  5. use Illuminate\Database\Query\Builder;
  6. use Luticate\Utils\Business\LuArrayUtils;
  7. use Luticate\Utils\Business\LuStringUtils;
  8. use Luticate\Utils\Dbo\LuDbo;
  9. use Luticate\Utils\Dbo\LuPaginatedDbo;
  10. abstract class LuDataAccess implements LuDatabaseProvider {
  11. protected static $_connection = "mydb";
  12. protected static $_table = "mydb_table";
  13. protected static $_table_as = "__t__";
  14. protected static $_dboClass = LuDbo::class;
  15. protected static $_dboArrayClass = null;
  16. protected static $_dboIgnoreList = [];
  17. public static function setupDatabases($databases)
  18. {
  19. $capsule = new Capsule;
  20. foreach ($databases as $database) {
  21. if ($database['driver'] == 'pgsql' || $database['driver'] == 'mysql' ||
  22. $database['driver'] == 'sqlite' || $database['driver'] == 'sqlsrv') {
  23. $default = [
  24. 'name' => 'mydb',
  25. 'host' => '172.17.0.1',
  26. 'database' => 'luticate2',
  27. 'username' => 'dev',
  28. 'password' => 'dev',
  29. 'charset' => 'utf8',
  30. 'collation' => 'utf8_unicode_ci',
  31. 'prefix' => ''
  32. ];
  33. $db = array_merge($default, $database);
  34. $capsule->addConnection($db, $database['name']);
  35. }
  36. }
  37. $capsule->setAsGlobal();
  38. }
  39. public static function transact(\Closure $function)
  40. {
  41. return static::getConnection()->transaction($function);
  42. }
  43. /**
  44. * @return \PDO
  45. */
  46. public static function getPdo()
  47. {
  48. return self::getConnection()->getPdo();
  49. }
  50. /**
  51. * @return Connection
  52. */
  53. public static function getConnection()
  54. {
  55. return Capsule::connection(static::$_connection);
  56. }
  57. /**
  58. * @return Builder
  59. */
  60. public static function getTableAs()
  61. {
  62. return static::getConnection()->table(static::$_table . " as " . static::$_table_as);
  63. }
  64. /**
  65. * @return Builder
  66. */
  67. public static function getTable()
  68. {
  69. return static::getConnection()->table(static::$_table);
  70. }
  71. public static function getDboClassArray()
  72. {
  73. if (is_null(static::$_dboArrayClass)) {
  74. return static::$_dboClass . "[]";
  75. }
  76. return static::$_dboArrayClass;
  77. }
  78. /**
  79. * @param $query Builder|callable
  80. * @return Builder
  81. */
  82. public static function resolveQuery($query)
  83. {
  84. if (is_callable($query)) {
  85. $query = $query(static::getTableAs());
  86. }
  87. else if (is_null($query)) {
  88. return static::getTableAs();
  89. }
  90. return $query;
  91. }
  92. /**
  93. * @param $dbo LuDbo
  94. * @param array $ignoreList
  95. * @return array
  96. */
  97. public static function prepareDbo($dbo, $ignoreList = [])
  98. {
  99. $json = $dbo->jsonSerialize();
  100. foreach (array_merge(static::$_dboIgnoreList, $ignoreList) as $ignore) {
  101. unset($json[$ignore]);
  102. }
  103. $json = LuArrayUtils::camelCaseToSnake($json);
  104. return $json;
  105. }
  106. public static function getData($query)
  107. {
  108. $query = static::resolveQuery($query);
  109. $sql = $query->toSql();
  110. $string = static::getConnection()->select("WITH query AS (${sql}) SELECT COALESCE(json_agg(data), '[]'::json) AS data FROM query data", $query->getBindings())[0]->data;
  111. $data = LuStringUtils::convertJsonString($string);
  112. return $data;
  113. }
  114. /**
  115. * @param $query Builder|callable
  116. * @return LuDBo[]
  117. */
  118. public static function getMultiple($query)
  119. {
  120. $data = static::getData($query);
  121. return LuDbo::deserializeValue($data, static::$_dboClass . "[]");
  122. }
  123. /**
  124. * @param $query Builder|callable
  125. * @return LuDBo
  126. */
  127. public static function getSingle($query)
  128. {
  129. $data = static::getData($query);
  130. if (count($data) < 1) {
  131. return null;
  132. }
  133. return LuDbo::deserializeValue($data[0], static::$_dboClass);
  134. }
  135. public static function getMultiplePaginated($query, $page, $perPage)
  136. {
  137. $query = static::resolveQuery($query);
  138. $sql = $query->toSql();
  139. $count = static::getConnection()->select("WITH query AS (${sql}) SELECT count(data) AS data FROM query data", $query->getBindings())[0]->data;
  140. $query->take($perPage)->offset($page * $perPage);
  141. $data = self::getMultiple($query);
  142. return new LuPaginatedDbo($count, $data);
  143. }
  144. /**
  145. * @param $id
  146. * @return LuDbo
  147. */
  148. public static function getSingleById($id)
  149. {
  150. return static::getSingle(static::getTableAs()->where("id", "=", $id));
  151. }
  152. /**
  153. * @param $id
  154. * @return int
  155. */
  156. public static function deleteSingleById($id)
  157. {
  158. return static::getTableAs()->delete($id);
  159. }
  160. /**
  161. * @param $query Builder|callable
  162. * @return int
  163. */
  164. public static function deleteMultiple($query)
  165. {
  166. $query = static::resolveQuery($query);
  167. return $query->delete();
  168. }
  169. /**
  170. * @param $dbo LuDbo
  171. * @param string[] $ignoreList
  172. * @return bool
  173. */
  174. public static function addSingle($dbo, $ignoreList = [])
  175. {
  176. $json = static::prepareDbo($dbo, $ignoreList);
  177. return static::getTable()->insert($json);
  178. }
  179. /**
  180. * @param $dbo LuDbo
  181. * @param string[] $ignoreList
  182. * @return int
  183. */
  184. public static function addSingleId($dbo, $ignoreList = [])
  185. {
  186. $json = static::prepareDbo($dbo, $ignoreList);
  187. unset($json['id']);
  188. return static::getTable()->insertGetId($json);
  189. }
  190. /**
  191. * @param $dbo LuDbo
  192. * @param int $id
  193. * @param string[] $ignoreList
  194. * @return int
  195. */
  196. public static function editSingleById($dbo, $id = null, $ignoreList = [])
  197. {
  198. $json = static::prepareDbo($dbo, $ignoreList);
  199. if (is_null($id)) {
  200. $id = $json['id'];
  201. unset($json['id']);
  202. }
  203. return static::getTable()->where("id", "=", $id)->update($json);
  204. }
  205. /**
  206. * @param $dbo LuDbo
  207. * @param $query Builder|callable
  208. * @param string[] $ignoreList
  209. * @return int
  210. */
  211. public static function editMultiple($dbo, $query, $ignoreList = [])
  212. {
  213. $query = static::resolveQuery($query);
  214. $json = static::prepareDbo($dbo, $ignoreList);
  215. return $query->update($json);
  216. }
  217. }