1313 final class Query {
1414
1515 /**
16- * @var QueryParameter[]
16+ * @var array<string, QueryParameter>
1717 */
1818 private array $ queryParameters ;
1919
@@ -30,15 +30,17 @@ static function createFromString (string $query) : Query {
3030 * @param QueryParameter ...$queryParameters
3131 */
3232 function __construct (QueryParameter ...$ queryParameters ) {
33- $ this ->queryParameters = $ queryParameters ;
33+ foreach ($ queryParameters as $ queryParameter ) {
34+ $ this ->queryParameters [$ queryParameter ->getKey ()] = $ queryParameter ;
35+ }
3436 }
3537
3638 /**
3739 * @param string $key
3840 * @return bool
3941 */
4042 function hasParameter (string $ key ) : bool {
41- return $ this ->getParameter ( $ key) !== null ; // todo: we could build an index and read from that instead
43+ return isset ( $ this ->queryParameters [ $ key]);
4244 }
4345
4446 /**
@@ -47,13 +49,32 @@ function hasParameter (string $key) : bool {
4749 * @return QueryParameter|null
4850 */
4951 function getParameter (string $ key ) : ?QueryParameter {
50- foreach ($ this ->queryParameters as $ parameter ) {
51- if ($ parameter ->getKey () === $ key ) {
52- return $ parameter ;
53- }
54- }
52+ return $ this ->queryParameters [$ key ] ?? null ;
53+ }
54+
55+ function withParameter (QueryParameter $ queryParameter ) : self {
56+ $ instance = clone $ this ;
57+ $ instance ->queryParameters [$ queryParameter ->getKey ()] = $ queryParameter ;
58+
59+ return $ instance ;
60+ }
61+
62+ function withParameterKeyRemoved (string $ queryParameterKey ) : self {
63+ $ instance = clone $ this ;
64+ unset($ instance ->queryParameters [$ queryParameterKey ]);
5565
56- return null ;
66+ return $ instance ;
67+ }
68+
69+ /**
70+ * @throws InvalidArgumentException
71+ * @param string $key
72+ * @param mixed $value
73+ *
74+ * @return self
75+ */
76+ function withParameterKeyAndValue (string $ key , mixed $ value ) : self {
77+ return $ this ->withParameter (QueryParameter::create ($ key , $ value ));
5778 }
5879
5980 /**
0 commit comments