Skip to content

Commit 34dfa57

Browse files
committed
fix: refresh updated entity using the base methods to avoid user-defined constraints
1 parent eaf50d8 commit 34dfa57

File tree

4 files changed

+132
-15
lines changed

4 files changed

+132
-15
lines changed

src/Concerns/HandlesRelationStandardBatchOperations.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,8 @@ protected function batchUpdateWithTransaction(Request $request, $parentKey)
219219
Arr::get($resource, 'pivot', [])
220220
);
221221

222-
$entityQuery = $this->buildUpdateFetchQuery(
223-
$request, $parentEntity, $requestedRelations
224-
);
225-
$entity = $this->runUpdateFetchQuery(
226-
$request, $entityQuery, $parentEntity, $entity->{$this->keyName()}
222+
$entity = $this->refreshUpdatedEntity(
223+
$request, $parentEntity,$requestedRelations, $entity->{$this->keyName()}
227224
);
228225

229226
$entity = $this->cleanupEntity($entity);

src/Concerns/HandlesRelationStandardOperations.php

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ protected function buildIndexFetchQuery(Request $request, Model $parentEntity, a
162162
}
163163

164164
/**
165-
* Builds Eloquent query for fetching relation entity.
165+
* Wrapper function to build Eloquent query for fetching relation entity.
166166
*
167167
* @param Request $request
168168
* @param Model $parentEntity
@@ -174,7 +174,29 @@ protected function buildRelationFetchQuery(
174174
Model $parentEntity,
175175
array $requestedRelations
176176
): Relation {
177-
return $this->relationQueryBuilder->buildQuery($this->newRelationQuery($parentEntity), $request);
177+
return $this->buildRelationFetchQueryBase(
178+
$request,
179+
$parentEntity,
180+
$requestedRelations
181+
);
182+
}
183+
184+
/**
185+
* Builds Eloquent query for fetching relation entity.
186+
*
187+
* @param Request $request
188+
* @param Model $parentEntity
189+
* @param array $requestedRelations
190+
* @return Relation
191+
*/
192+
protected function buildRelationFetchQueryBase(
193+
Request $request,
194+
Model $parentEntity,
195+
array $requestedRelations
196+
): Relation {
197+
return $this->relationQueryBuilder->buildQuery(
198+
$this->newRelationQuery($parentEntity), $request
199+
);
178200
}
179201

180202
/**
@@ -292,7 +314,10 @@ protected function storeWithTransaction(Request $request, $parentKey)
292314
$query = $this->buildStoreFetchQuery($request, $parentEntity, $requestedRelations);
293315

294316
$entity = $this->runStoreFetchQuery(
295-
$request, $query, $parentEntity, $entity->{$this->keyName()}
317+
$request,
318+
$query,
319+
$parentEntity,
320+
$entity->{$this->keyName()}
296321
);
297322
$entity->wasRecentlyCreated = true;
298323

@@ -554,7 +579,7 @@ protected function runShowFetchQuery(Request $request, Relation $query, Model $p
554579
}
555580

556581
/**
557-
* Runs the given query for fetching relation entity.
582+
* Wrapper function to run the given query for fetching relation entity.
558583
*
559584
* @param Request $request
560585
* @param Relation $query
@@ -564,6 +589,29 @@ protected function runShowFetchQuery(Request $request, Relation $query, Model $p
564589
*/
565590
protected function runRelationFetchQuery(Request $request, Relation $query, Model $parentEntity, $relatedKey): Model
566591
{
592+
return $this->runRelationFetchQueryBase(
593+
$request,
594+
$query,
595+
$parentEntity,
596+
$relatedKey
597+
);
598+
}
599+
600+
/**
601+
* Runs the given query for fetching relation entity.
602+
*
603+
* @param Request $request
604+
* @param Relation $query
605+
* @param Model $parentEntity
606+
* @param string|int $relatedKey
607+
* @return Model
608+
*/
609+
protected function runRelationFetchQueryBase(
610+
Request $request,
611+
Relation $query,
612+
Model $parentEntity,
613+
$relatedKey
614+
): Model {
567615
if ($this->isOneToOneRelation($parentEntity)) {
568616
return $query->firstOrFail();
569617
}
@@ -671,7 +719,9 @@ protected function updateWithTransaction(Request $request, $parentKey, $relatedK
671719
$request->get('pivot', [])
672720
);
673721

674-
$entity = $this->runUpdateFetchQuery($request, $query, $parentEntity, $relatedKey);
722+
$entity = $this->refreshUpdatedEntity(
723+
$request, $parentEntity, $requestedRelations, $relatedKey
724+
);
675725
$entity = $this->cleanupEntity($entity);
676726

677727
if (count($this->getPivotJson())) {
@@ -745,6 +795,35 @@ protected function runUpdateFetchQuery(Request $request, Relation $query, Model
745795
return $this->runRelationFetchQuery($request, $query, $parentEntity, $relatedKey);
746796
}
747797

798+
/**
799+
* Fetches the relation model that has just been updated using the given key.
800+
*
801+
* @param Request $request
802+
* @param Model $parentEntity
803+
* @param array $requestedRelations
804+
* @param string|int $relatedKey
805+
* @return Model
806+
*/
807+
protected function refreshUpdatedEntity(
808+
Request $request,
809+
Model $parentEntity,
810+
array $requestedRelations,
811+
$relatedKey
812+
): Model {
813+
$query = $this->buildRelationFetchQueryBase(
814+
$request,
815+
$parentEntity,
816+
$requestedRelations
817+
);
818+
819+
return $this->runRelationFetchQueryBase(
820+
$request,
821+
$query,
822+
$parentEntity,
823+
$relatedKey
824+
);
825+
}
826+
748827
/**
749828
* The hook is executed before updating a relation resource.
750829
*

src/Concerns/HandlesStandardBatchOperations.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,9 @@ protected function batchUpdateWithTransaction(Request $request)
163163

164164
$this->beforeUpdateFresh($request, $entity);
165165

166-
$entityQuery = $this->buildUpdateFetchQuery($request, $requestedRelations);
167-
$entity = $this->runUpdateFetchQuery($request, $entityQuery, $entity->{$this->keyName()});
166+
$entity = $this->refreshUpdatedEntity(
167+
$request, $requestedRelations, $entity->{$this->keyName()}
168+
);
168169

169170
$this->afterSave($request, $entity);
170171
$this->afterUpdate($request, $entity);

src/Concerns/HandlesStandardOperations.php

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,25 @@ protected function buildIndexFetchQuery(Request $request, array $requestedRelati
7373
}
7474

7575
/**
76-
* Builds Eloquent query for fetching entity(-ies).
76+
* Wrapper function to build Eloquent query for fetching entity(-ies).
7777
*
7878
* @param Request $request
7979
* @param array $requestedRelations
8080
* @return Builder
8181
*/
8282
protected function buildFetchQuery(Request $request, array $requestedRelations): Builder
83+
{
84+
return $this->buildFetchQueryBase($request, $requestedRelations);
85+
}
86+
87+
/**
88+
* Builds Eloquent query for fetching entity(-ies).
89+
*
90+
* @param Request $request
91+
* @param array $requestedRelations
92+
* @return Builder
93+
*/
94+
protected function buildFetchQueryBase(Request $request, array $requestedRelations): Builder
8395
{
8496
return $this->queryBuilder->buildQuery($this->newModelQuery(), $request);
8597
}
@@ -386,14 +398,27 @@ protected function runShowFetchQuery(Request $request, Builder $query, $key): Mo
386398
}
387399

388400
/**
389-
* Runs the given query for fetching entity.
401+
* Wrapper function to run the given query for fetching entity.
390402
*
391403
* @param Request $request
392404
* @param Builder $query
393405
* @param int|string $key
394406
* @return Model
395407
*/
396408
protected function runFetchQuery(Request $request, Builder $query, $key): Model
409+
{
410+
return $this->runFetchQueryBase($request, $query, $key);
411+
}
412+
413+
/**
414+
* Runs the given query for fetching entity.
415+
*
416+
* @param Request $request
417+
* @param Builder $query
418+
* @param int|string $key
419+
* @return Model
420+
*/
421+
protected function runFetchQueryBase(Request $request, Builder $query, $key): Model
397422
{
398423
return $query->where($this->resolveQualifiedKeyName(), $key)->firstOrFail();
399424
}
@@ -470,7 +495,7 @@ protected function updateWithTransaction(Request $request, $key)
470495
return $beforeUpdateFreshResult;
471496
}
472497

473-
$entity = $this->runUpdateFetchQuery($request, $query, $key);
498+
$entity = $this->refreshUpdatedEntity($request, $requestedRelations,$key);
474499

475500
$afterSaveHookResult = $this->afterSave($request, $entity);
476501
if ($this->hookResponds($afterSaveHookResult)) {
@@ -512,6 +537,21 @@ protected function runUpdateFetchQuery(Request $request, Builder $query, $key):
512537
return $this->runFetchQuery($request, $query, $key);
513538
}
514539

540+
/**
541+
* Fetches the model that has just been updated using the given key.
542+
*
543+
* @param Request $request
544+
* @param array $requestedRelations
545+
* @param int|string $key
546+
* @return Model
547+
*/
548+
protected function refreshUpdatedEntity(Request $request, array $requestedRelations, $key): Model
549+
{
550+
$query = $this->buildFetchQueryBase($request, $requestedRelations);
551+
552+
return $this->runFetchQueryBase($request, $query, $key);
553+
}
554+
515555
/**
516556
* The hook is executed before updating a resource.
517557
*

0 commit comments

Comments
 (0)