| @@ 952-1001 (lines=50) @@ | ||
| 949 | * @psalm-param class-string|object|null $class |
|
| 950 | * @psalm-param array<int, mixed>|null $params |
|
| 951 | */ |
|
| 952 | public function &fetchObject( |
|
| 953 | $class = null, |
|
| 954 | array $params = null, |
|
| 955 | bool $reset = false |
|
| 956 | ) { |
|
| 957 | if ($reset) { |
|
| 958 | $this->reset(); |
|
| 959 | } |
|
| 960 | ||
| 961 | // fallback |
|
| 962 | if (!$class || $class === 'stdClass') { |
|
| 963 | $class = \stdClass::class; |
|
| 964 | } |
|
| 965 | ||
| 966 | $row = $this->fetch_assoc(); |
|
| 967 | $row = $row ? $this->cast($row) : false; |
|
| 968 | ||
| 969 | if (!$row) { |
|
| 970 | /** @noinspection PhpUnnecessaryLocalVariableInspection */ |
|
| 971 | $dataTmp = false; |
|
| 972 | ||
| 973 | return $dataTmp; |
|
| 974 | } |
|
| 975 | ||
| 976 | if (\is_object($class)) { |
|
| 977 | $classTmp = $class; |
|
| 978 | } elseif ($class && $params) { |
|
| 979 | $reflectorTmp = new \ReflectionClass($class); |
|
| 980 | $classTmp = $reflectorTmp->newInstanceArgs($params); |
|
| 981 | } else { |
|
| 982 | $classTmp = new $class(); |
|
| 983 | } |
|
| 984 | ||
| 985 | if ($class === \stdClass::class) { |
|
| 986 | $propertyAccessor = null; |
|
| 987 | } else { |
|
| 988 | $propertyAccessor = PropertyAccess::createPropertyAccessor(); |
|
| 989 | } |
|
| 990 | ||
| 991 | foreach ($row as $key => &$value) { |
|
| 992 | if ($class === \stdClass::class) { |
|
| 993 | $classTmp->{$key} = $value; |
|
| 994 | } else { |
|
| 995 | assert($propertyAccessor instanceof \Symfony\Component\PropertyAccess\PropertyAccessor); |
|
| 996 | $propertyAccessor->setValue($classTmp, $key, $value); |
|
| 997 | } |
|
| 998 | } |
|
| 999 | ||
| 1000 | return $classTmp; |
|
| 1001 | } |
|
| 1002 | ||
| 1003 | /** |
|
| 1004 | * Returns all rows at once as key-value pairs. |
|
| @@ 1095-1142 (lines=48) @@ | ||
| 1092 | * @psalm-param class-string|object|null $class |
|
| 1093 | * @psalm-param array<int, mixed>|null $params |
|
| 1094 | */ |
|
| 1095 | public function fetchYield( |
|
| 1096 | $class = null, |
|
| 1097 | array $params = null, |
|
| 1098 | bool $reset = false |
|
| 1099 | ): \Generator { |
|
| 1100 | if ($reset) { |
|
| 1101 | $this->reset(); |
|
| 1102 | } |
|
| 1103 | ||
| 1104 | // fallback |
|
| 1105 | if (!$class || $class === 'stdClass') { |
|
| 1106 | $class = \stdClass::class; |
|
| 1107 | } |
|
| 1108 | ||
| 1109 | if (\is_object($class)) { |
|
| 1110 | $classTmp = $class; |
|
| 1111 | } elseif ($class && $params) { |
|
| 1112 | $reflectorTmp = new \ReflectionClass($class); |
|
| 1113 | $classTmp = $reflectorTmp->newInstanceArgs($params); |
|
| 1114 | } else { |
|
| 1115 | $classTmp = new $class(); |
|
| 1116 | } |
|
| 1117 | ||
| 1118 | $row = $this->fetch_assoc(); |
|
| 1119 | $row = $row ? $this->cast($row) : false; |
|
| 1120 | ||
| 1121 | if (!$row) { |
|
| 1122 | return; |
|
| 1123 | } |
|
| 1124 | ||
| 1125 | if ($class === \stdClass::class) { |
|
| 1126 | $propertyAccessor = null; |
|
| 1127 | } else { |
|
| 1128 | $propertyAccessor = PropertyAccess::createPropertyAccessor(); |
|
| 1129 | } |
|
| 1130 | ||
| 1131 | /** @noinspection AlterInForeachInspection */ |
|
| 1132 | foreach ($row as $key => &$value) { |
|
| 1133 | if ($class === \stdClass::class) { |
|
| 1134 | $classTmp->{$key} = $value; |
|
| 1135 | } else { |
|
| 1136 | assert($propertyAccessor instanceof \Symfony\Component\PropertyAccess\PropertyAccessor); |
|
| 1137 | $propertyAccessor->setValue($classTmp, $key, $value); |
|
| 1138 | } |
|
| 1139 | } |
|
| 1140 | ||
| 1141 | yield $classTmp; |
|
| 1142 | } |
|
| 1143 | ||
| 1144 | /** |
|
| 1145 | * @return mixed|null |
|