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 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 {
  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 transact(\Closure $function)
  18. {
  19. return static::getConnection()->transaction($function);
  20. }
  21. /**
  22. * @return \PDO
  23. */
  24. public static function getPdo()
  25. {
  26. return self::getConnection()->getPdo();
  27. }
  28. /**
  29. * @return Connection
  30. */
  31. public static function getConnection()
  32. {
  33. return Capsule::connection(static::$_connection);
  34. }
  35. /**
  36. * @return Builder
  37. */
  38. public static function getTableAs()
  39. {
  40. return static::getConnection()->table(static::$_table . " as " . static::$_table_as);
  41. }
  42. /**
  43. * @return Builder
  44. */
  45. public static function getTable()
  46. {
  47. return static::getConnection()->table(static::$_table);
  48. }
  49. public static function getDboClassArray()
  50. {
  51. if (is_null(static::$_dboArrayClass)) {
  52. return static::$_dboClass . "[]";
  53. }
  54. return static::$_dboArrayClass;
  55. }
  56. /**
  57. * @param $query Builder|callable
  58. * @return Builder
  59. */
  60. public static function resolveQuery($query)
  61. {
  62. if (is_callable($query)) {
  63. $query = $query(static::getTableAs());
  64. }
  65. else if (is_null($query)) {
  66. return static::getTableAs();
  67. }
  68. return $query;
  69. }
  70. /**
  71. * @param $dbo LuDbo
  72. * @param array $ignoreList
  73. * @return array
  74. */
  75. public static function prepareDbo($dbo, $ignoreList = [])
  76. {
  77. $json = $dbo->jsonSerialize();
  78. foreach (array_merge(static::$_dboIgnoreList, $ignoreList) as $ignore) {
  79. unset($json[$ignore]);
  80. }
  81. $json = LuArrayUtils::camelCaseToSnake($json);
  82. return $json;
  83. }
  84. public static function getData($query)
  85. {
  86. $query = static::resolveQuery($query);
  87. $sql = $query->toSql();
  88. $string = static::getConnection()->select("WITH query AS (${sql}) SELECT COALESCE(json_agg(data), '[]'::json) AS data FROM query data", $query->getBindings())[0]->data;
  89. $data = LuStringUtils::convertJsonString($string);
  90. return $data;
  91. }
  92. /**
  93. * @param $query Builder|callable
  94. * @return LuDBo[]
  95. */
  96. public static function getMultiple($query)
  97. {
  98. $data = static::getData($query);
  99. return LuDbo::deserializeValue($data, static::$_dboClass . "[]");
  100. }
  101. /**
  102. * @param $query Builder|callable
  103. * @return LuDBo
  104. */
  105. public static function getSingle($query)
  106. {
  107. $data = static::getData($query);
  108. if (count($data) < 1) {
  109. return null;
  110. }
  111. return LuDbo::deserializeValue($data[0], static::$_dboClass);
  112. }
  113. public static function getMultiplePaginated($query, $page, $perPage)
  114. {
  115. $query = static::resolveQuery($query);
  116. $sql = $query->toSql();
  117. $count = static::getConnection()->select("WITH query AS (${sql}) SELECT count(data) AS data FROM query data", $query->getBindings())[0]->data;
  118. $query->take($perPage)->offset($page * $perPage);
  119. $data = self::getMultiple($query);
  120. return new LuPaginatedDbo($count, $data);
  121. }
  122. /**
  123. * @param $id
  124. * @return LuDbo
  125. */
  126. public static function getSingleById($id)
  127. {
  128. return static::getSingle(static::getTableAs()->where("id", "=", $id));
  129. }
  130. /**
  131. * @param $id
  132. * @return int
  133. */
  134. public static function deleteSingleById($id)
  135. {
  136. return static::getTableAs()->delete($id);
  137. }
  138. /**
  139. * @param $query Builder|callable
  140. * @return int
  141. */
  142. public static function deleteMultiple($query)
  143. {
  144. $query = static::resolveQuery($query);
  145. return $query->delete();
  146. }
  147. /**
  148. * @param $dbo LuDbo
  149. * @param string[] $ignoreList
  150. * @return bool
  151. */
  152. public static function addSingle($dbo, $ignoreList = [])
  153. {
  154. $json = static::prepareDbo($dbo, $ignoreList);
  155. return static::getTable()->insert($json);
  156. }
  157. /**
  158. * @param $dbo LuDbo
  159. * @param string[] $ignoreList
  160. * @return int
  161. */
  162. public static function addSingleId($dbo, $ignoreList = [])
  163. {
  164. $json = static::prepareDbo($dbo, $ignoreList);
  165. unset($json['id']);
  166. return static::getTable()->insertGetId($json);
  167. }
  168. /**
  169. * @param $dbo LuDbo
  170. * @param string[] $ignoreList
  171. * @return int
  172. */
  173. public static function editSingleById($dbo, $ignoreList = [])
  174. {
  175. $json = static::prepareDbo($dbo, $ignoreList);
  176. $id = $json['id'];
  177. unset($json['id']);
  178. return static::getTable()->where("id", "=", $id)->update($json);
  179. }
  180. /**
  181. * @param $dbo LuDbo
  182. * @param $query Builder|callable
  183. * @param string[] $ignoreList
  184. * @return int
  185. */
  186. public static function editMultiple($dbo, $query, $ignoreList = [])
  187. {
  188. $query = static::resolveQuery($query);
  189. $json = static::prepareDbo($dbo, $ignoreList);
  190. return $query->update($json);
  191. }
  192. }