123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- <?php
- /**
- * Created by PhpStorm.
- * User: robin
- * Date: 6/10/16
- * Time: 2:37 PM
- */
-
- namespace Luticate\Utils\DataAccess;
-
- use Illuminate\Database\Connection;
- use Luticate\Utils\Business\LuStringUtils;
- use Luticate\Utils\Dbo\LuDbo;
- use Illuminate\Database\Capsule\Manager as Capsule;
- use Luticate\Utils\Dbo\LuMultipleDbo;
-
- abstract class LuStoredProcedure
- {
- protected static $_connection = "mydb";
- protected static $_storedProcedure = "mydb_table";
- protected static $_dboArrayClass = LuDbo::class;
-
- /**
- * @return Connection
- */
- public static function getConnection()
- {
- return Capsule::connection(static::$_connection);
- }
-
- public static function getArgsArray($args)
- {
- $argsArray = [];
- for ($i = 0; $i < count($args); ++$i) {
- $argsArray[":_arg" . $i] = $args[$i];
- }
- return $argsArray;
- }
-
- public static function getSqlSelectQuery($args)
- {
- $storedProcedure = static::$_storedProcedure;
- $argsString = implode(", ", array_map(function($i)
- {
- return ":_arg" . $i;
- }, range(0, count($args) - 1)));
- $query = "SELECT COALESCE(json_agg(data), '[]'::json) as data FROM ${storedProcedure}(${argsString}) data";
- return $query;
- }
-
- /**
- * @param $args array
- * @return LuDbo[]
- */
- public static function getMultiple($args)
- {
- $argsArray = static::getArgsArray($args);
- $query = static::getSqlSelectQuery($args);
- $values = static::getConnection()->select($query, $argsArray);
-
- $value = $values[0]->data;
- $json = LuStringUtils::convertJsonString($value);
- $dboValues = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray();
- return $dboValues;
- }
-
- /**
- * @param $args array
- * @return LuDbo|null
- */
- public static function getSingle($args)
- {
- $argsArray = static::getArgsArray($args);
- $query = static::getSqlSelectQuery($args);
- $values = static::getConnection()->select($query, $argsArray);
-
- $value = $values[0]->data;
- $json = LuStringUtils::convertJsonString($value);
- if (count($json) < 1 || is_null($json[0])) {
- return null;
- }
- $dboValue = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray()[0];
- return $dboValue;
- }
-
- /**
- * @param $args array
- * @param $page int The page number, 0 based
- * @param $perPage int The number of items per page
- * @return LuMultipleDbo
- */
- public static function getMultiplePaginated($args, $page, $perPage)
- {
- $argsArray = static::getArgsArray($args);
- $argsArray[":_page"] = $page;
- $argsArray[":_perPage"] = $perPage;
-
- $storedProcedure = static::$_storedProcedure;
- $argsString = implode(", ", array_map(function($i)
- {
- return ":_arg" . $i;
- }, range(0, count($args) - 1)));
-
- $query = "SELECT (SELECT count(*) FROM ${storedProcedure}(${argsString})) as count,
- (SELECT COALESCE(json_agg(data), '[]'::json) FROM (SELECT data FROM ${storedProcedure}(${argsString}) data OFFSET (:_page::int * :_perPage::int) LIMIT :_perPage) data) as data";
- $values = static::getConnection()->select($query, $argsArray);
-
- $value = $values[0];
- if (is_null($value->data))
- {
- $value->data = '[]';
- }
- $json = LuStringUtils::convertJsonString($value->data);
- $dboValues = call_user_func([static::$_dboArrayClass, 'jsonDeserialize'], $json)->getArray();
- return new LuMultipleDbo($value->count, $dboValues);
- }
- }
|