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.

LuStoredProcedure.php 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: robin
  5. * Date: 6/10/16
  6. * Time: 2:37 PM
  7. */
  8. namespace Luticate\Utils\DataAccess;
  9. use Illuminate\Database\Connection;
  10. use Luticate\Utils\Business\LuStringUtils;
  11. use Luticate\Utils\Dbo\LuDbo;
  12. use Illuminate\Database\Capsule\Manager as Capsule;
  13. use Luticate\Utils\Dbo\LuMultipleDbo;
  14. abstract class LuStoredProcedure
  15. {
  16. protected static $_connection = "mydb";
  17. protected static $_storedProcedure = "mydb_table";
  18. protected static $_dboArrayClass = LuDbo::class;
  19. /**
  20. * @return Connection
  21. */
  22. public static function getConnection()
  23. {
  24. return Capsule::connection(static::$_connection);
  25. }
  26. public static function getArgsArray($args)
  27. {
  28. $argsArray = [];
  29. for ($i = 0; $i < count($args); ++$i) {
  30. $argsArray[":_arg" . $i] = $args[$i];
  31. }
  32. return $argsArray;
  33. }
  34. public static function getSqlSelectQuery($args)
  35. {
  36. $storedProcedure = static::$_storedProcedure;
  37. $argsString = implode(", ", array_map(function($i)
  38. {
  39. return ":_arg" . $i;
  40. }, range(0, count($args) - 1)));
  41. $query = "SELECT COALESCE(json_agg(data), '[]'::json) as data FROM ${storedProcedure}(${argsString}) data";
  42. return $query;
  43. }
  44. /**
  45. * @param $args array
  46. * @return LuDbo[]
  47. */
  48. public static function getMultiple($args)
  49. {
  50. $argsArray = static::getArgsArray($args);
  51. $query = static::getSqlSelectQuery($args);
  52. $values = static::getConnection()->select($query, $argsArray);
  53. $value = $values[0]->data;
  54. $json = LuStringUtils::convertJsonString($value);
  55. $dboValues = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray();
  56. return $dboValues;
  57. }
  58. /**
  59. * @param $args array
  60. * @return LuDbo|null
  61. */
  62. public static function getSingle($args)
  63. {
  64. $argsArray = static::getArgsArray($args);
  65. $query = static::getSqlSelectQuery($args);
  66. $values = static::getConnection()->select($query, $argsArray);
  67. $value = $values[0]->data;
  68. $json = LuStringUtils::convertJsonString($value);
  69. if (count($json) < 1 || is_null($json[0])) {
  70. return null;
  71. }
  72. $dboValue = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray()[0];
  73. return $dboValue;
  74. }
  75. /**
  76. * @param $args array
  77. * @param $page int The page number, 0 based
  78. * @param $perPage int The number of items per page
  79. * @return LuMultipleDbo
  80. */
  81. public static function getMultiplePaginated($args, $page, $perPage)
  82. {
  83. $argsArray = static::getArgsArray($args);
  84. $argsArray[":_page"] = $page;
  85. $argsArray[":_perPage"] = $perPage;
  86. $storedProcedure = static::$_storedProcedure;
  87. $argsString = implode(", ", array_map(function($i)
  88. {
  89. return ":_arg" . $i;
  90. }, range(0, count($args) - 1)));
  91. $query = "SELECT (SELECT count(*) FROM ${storedProcedure}(${argsString})) as count,
  92. (SELECT COALESCE(json_agg(data), '[]'::json) FROM (SELECT data FROM ${storedProcedure}(${argsString}) data OFFSET (:_page::int * :_perPage::int) LIMIT :_perPage) data) as data";
  93. $values = static::getConnection()->select($query, $argsArray);
  94. $value = $values[0];
  95. if (is_null($value->data))
  96. {
  97. $value->data = '[]';
  98. }
  99. $json = LuStringUtils::convertJsonString($value->data);
  100. $dboValues = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray();
  101. return new LuMultipleDbo($value->count, $dboValues);
  102. }
  103. }