Skip to content

Commit 6d50eae

Browse files
committed
refactor: standardize fetching entities in mutating operations
1 parent 83e0b09 commit 6d50eae

File tree

11 files changed

+119
-52
lines changed

11 files changed

+119
-52
lines changed

src/Concerns/HandlesRelationStandardBatchOperations.php

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ protected function batchStoreWithTransaction(Request $request, $parentKey)
6060

6161
$requestedRelations = $this->relationsResolver->requestedRelations($request);
6262

63+
$entityQuery = $this->buildStoreFetchQuery($request, $parentEntity, $requestedRelations);
64+
6365
foreach ($resources as $resource) {
6466
/** @var Model $entity */
6567
$entity = new $resourceModelClass;
@@ -75,10 +77,12 @@ protected function batchStoreWithTransaction(Request $request, $parentKey)
7577
Arr::get($resource, 'pivot', [])
7678
);
7779

78-
$entity = $this->newRelationQuery($parentEntity)->where(
79-
$this->resolveQualifiedKeyName(),
80+
$entity = $this->runStoreFetchQuery(
81+
$request,
82+
$entityQuery,
83+
$parentEntity,
8084
$entity->{$this->keyName()}
81-
)->first();
85+
);
8286
$entity->wasRecentlyCreated = true;
8387

8488
$entity = $this->cleanupEntity($entity);
@@ -194,6 +198,8 @@ protected function batchUpdateWithTransaction(Request $request, $parentKey)
194198
$query = $this->buildBatchUpdateFetchQuery($request, $parentEntity, $requestedRelations);
195199
$entities = $this->runBatchUpdateFetchQuery($request, $query, $parentEntity);
196200

201+
$entityQuery = $this->buildUpdateFetchQuery($request, $parentEntity, $requestedRelations);
202+
197203
foreach ($entities as $entity) {
198204
/** @var Model $entity */
199205
$this->authorize($this->resolveAbility('update'), [$entity, $parentEntity]);
@@ -213,10 +219,9 @@ protected function batchUpdateWithTransaction(Request $request, $parentKey)
213219
Arr::get($resource, 'pivot', [])
214220
);
215221

216-
$entity = $this->newRelationQuery($parentEntity)->where(
217-
$this->resolveQualifiedKeyName(),
218-
$entity->{$this->keyName()}
219-
)->first();
222+
$entity = $this->runUpdateFetchQuery(
223+
$request, $entityQuery, $parentEntity, $entity->{$this->keyName()}
224+
);
220225

221226
$entity = $this->cleanupEntity($entity);
222227

@@ -395,6 +400,8 @@ protected function batchDestroyWithTransaction(Request $request, $parentKey)
395400
$query = $this->buildBatchDestroyFetchQuery($request, $parentEntity, $requestedRelations, $softDeletes);
396401
$entities = $this->runBatchDestroyFetchQuery($request, $query, $parentEntity);
397402

403+
$entityQuery = $this->buildStoreFetchQuery($request, $parentEntity, $requestedRelations);
404+
398405
foreach ($entities as $entity) {
399406
/** @var Model $entity */
400407
$this->authorize($this->resolveAbility($forceDeletes ? 'forceDelete' : 'delete'), [$entity, $parentEntity]);
@@ -403,11 +410,11 @@ protected function batchDestroyWithTransaction(Request $request, $parentKey)
403410

404411
if (!$forceDeletes) {
405412
$this->performDestroy($entity);
413+
406414
if ($softDeletes) {
407-
$entity = $this->newRelationQuery($parentEntity)->withTrashed()->where(
408-
$this->resolveQualifiedKeyName(),
409-
$entity->{$this->keyName()}
410-
)->firstOrFail();
415+
$entity = $this->runDestroyFetchQuery(
416+
$request, $entityQuery, $parentEntity, $entity->{$this->keyName()}
417+
);
411418
}
412419
} else {
413420
$this->performForceDestroy($entity);
@@ -562,6 +569,8 @@ protected function batchRestoreWithTransaction(Request $request, $parentKey)
562569
$query = $this->buildBatchRestoreFetchQuery($request, $parentEntity, $requestedRelations);
563570
$entities = $this->runBatchRestoreFetchQuery($request, $query, $parentEntity);
564571

572+
$entityQuery = $this->buildRestoreFetchQuery($request, $parentEntity, $requestedRelations);
573+
565574
foreach ($entities as $entity) {
566575
/** @var Model $entity */
567576
$this->authorize($this->resolveAbility('restore'), [$entity, $parentEntity]);
@@ -570,10 +579,9 @@ protected function batchRestoreWithTransaction(Request $request, $parentKey)
570579

571580
$this->performRestore($entity);
572581

573-
$entity = $this->newRelationQuery($parentEntity)->where(
574-
$this->resolveQualifiedKeyName(),
575-
$entity->{$this->keyName()}
576-
)->firstOrFail();
582+
$entity = $this->runRestoreFetchQuery(
583+
$request, $entityQuery, $parentEntity, $entity->{$this->keyName()}
584+
);
577585

578586
$entity = $this->cleanupEntity($entity);
579587

src/Concerns/HandlesRelationStandardOperations.php

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,11 @@ protected function storeWithTransaction(Request $request, $parentKey)
289289
$request->get('pivot', [])
290290
);
291291

292-
$entity = $this->newRelationQuery($parentEntity)->where(
293-
$this->resolveQualifiedKeyName(),
294-
$entity->{$this->keyName()}
295-
)->firstOrFail();
292+
$query = $this->buildStoreFetchQuery($request, $parentEntity, $requestedRelations);
293+
294+
$entity = $this->runStoreFetchQuery(
295+
$request, $query, $parentEntity, $entity->{$this->keyName()}
296+
);
296297
$entity->wasRecentlyCreated = true;
297298

298299
$entity = $this->cleanupEntity($entity);
@@ -393,6 +394,33 @@ protected function performStore(
393394
}
394395
}
395396

397+
/**
398+
* Builds Eloquent query for fetching relation entity in store method.
399+
*
400+
* @param Request $request
401+
* @param Model $parentEntity
402+
* @param array $requestedRelations
403+
* @return Relation
404+
*/
405+
protected function buildStoreFetchQuery(Request $request, Model $parentEntity, array $requestedRelations): Relation
406+
{
407+
return $this->buildRelationFetchQuery($request, $parentEntity, $requestedRelations);
408+
}
409+
410+
/**
411+
* Runs the given query for fetching relation entity in store method.
412+
*
413+
* @param Request $request
414+
* @param Relation $query
415+
* @param Model $parentEntity
416+
* @param string|int $relatedKey
417+
* @return Model
418+
*/
419+
protected function runStoreFetchQuery(Request $request, Relation $query, Model $parentEntity, $relatedKey): Model
420+
{
421+
return $this->runRelationFetchQuery($request, $query, $parentEntity, $relatedKey);
422+
}
423+
396424
/**
397425
* The hook is executed after creating or updating a relation resource.
398426
*
@@ -643,11 +671,7 @@ protected function updateWithTransaction(Request $request, $parentKey, $relatedK
643671
$request->get('pivot', [])
644672
);
645673

646-
$entity = $this->newRelationQuery($parentEntity)->where(
647-
$this->resolveQualifiedKeyName(),
648-
$entity->{$this->keyName()}
649-
)->firstOrFail();
650-
674+
$entity = $this->runUpdateFetchQuery($request, $query, $parentEntity, $relatedKey);
651675
$entity = $this->cleanupEntity($entity);
652676

653677
if (count($this->getPivotJson())) {
@@ -830,11 +854,9 @@ protected function destroyWithTransaction(Request $request, $parentKey, $related
830854

831855
if (!$forceDeletes) {
832856
$this->performDestroy($entity);
857+
833858
if ($softDeletes) {
834-
$entity = $this->newRelationQuery($parentEntity)->withTrashed()->where(
835-
$this->resolveQualifiedKeyName(),
836-
$entity->{$this->keyName()}
837-
)->firstOrFail();
859+
$entity = $this->runDestroyFetchQuery($request, $query, $parentEntity, $relatedKey);
838860
}
839861
} else {
840862
$this->performForceDestroy($entity);
@@ -1013,11 +1035,7 @@ protected function restoreWithTransaction(Request $request, $parentKey, $related
10131035

10141036
$this->performRestore($entity);
10151037

1016-
$entity = $this->newRelationQuery($parentEntity)->where(
1017-
$this->resolveQualifiedKeyName(),
1018-
$entity->{$this->keyName()}
1019-
)->firstOrFail();
1020-
1038+
$entity = $this->runRestoreFetchQuery($request, $query, $parentEntity, $relatedKey);
10211039
$entity = $this->cleanupEntity($entity);
10221040

10231041
if (count($this->getPivotJson())) {

src/Concerns/HandlesStandardBatchOperations.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ protected function batchStoreWithTransaction(Request $request)
5353

5454
$requestedRelations = $this->relationsResolver->requestedRelations($request);
5555

56+
$entityQuery = $this->buildStoreFetchQuery($request, $requestedRelations);
57+
5658
foreach ($resources as $resource) {
5759
/**
5860
* @var Model $entity
@@ -66,7 +68,7 @@ protected function batchStoreWithTransaction(Request $request)
6668

6769
$this->beforeStoreFresh($request, $entity);
6870

69-
$entity = $entity->fresh($requestedRelations);
71+
$entity = $this->runStoreFetchQuery($request, $entityQuery, $entity->{$this->keyName()});
7072
$entity->wasRecentlyCreated = true;
7173

7274
$this->afterSave($request, $entity);
@@ -144,6 +146,8 @@ protected function batchUpdateWithTransaction(Request $request)
144146
$query = $this->buildBatchUpdateFetchQuery($request, $requestedRelations);
145147
$entities = $this->runBatchUpdateFetchQuery($request, $query);
146148

149+
$entityQuery = $this->buildUpdateFetchQuery($request, $requestedRelations);
150+
147151
foreach ($entities as $entity) {
148152
/** @var Model $entity */
149153
$this->authorize($this->resolveAbility('update'), $entity);
@@ -161,7 +165,7 @@ protected function batchUpdateWithTransaction(Request $request)
161165

162166
$this->beforeUpdateFresh($request, $entity);
163167

164-
$entity = $entity->fresh($requestedRelations);
168+
$entity = $this->runUpdateFetchQuery($request, $entityQuery, $entity->{$this->keyName()});
165169

166170
$this->afterSave($request, $entity);
167171
$this->afterUpdate($request, $entity);
@@ -293,6 +297,8 @@ protected function batchDestroyWithTransaction(Request $request)
293297
$query = $this->buildBatchDestroyFetchQuery($request, $requestedRelations, $softDeletes);
294298
$entities = $this->runBatchDestroyFetchQuery($request, $query);
295299

300+
$entityQuery = $this->buildDestroyFetchQuery($request, $requestedRelations, $softDeletes);
301+
296302
foreach ($entities as $entity) {
297303
/**
298304
* @var Model $entity
@@ -303,9 +309,11 @@ protected function batchDestroyWithTransaction(Request $request)
303309

304310
if (!$forceDeletes) {
305311
$this->performDestroy($entity);
312+
306313
if ($softDeletes) {
307314
$this->beforeDestroyFresh($request, $entity);
308-
$entity = $entity->fresh($requestedRelations);
315+
316+
$entity = $this->runDestroyFetchQuery($request, $entityQuery, $entity->{$this->keyName()});
309317
}
310318
} else {
311319
$this->performForceDestroy($entity);
@@ -413,6 +421,8 @@ protected function batchRestoreWithTransaction(Request $request)
413421
$query = $this->buildBatchRestoreFetchQuery($request, $requestedRelations);
414422
$entities = $this->runBatchRestoreFetchQuery($request, $query);
415423

424+
$entityQuery = $this->buildRestoreFetchQuery($request, $requestedRelations);
425+
416426
foreach ($entities as $entity) {
417427
/**
418428
* @var Model $entity
@@ -425,7 +435,7 @@ protected function batchRestoreWithTransaction(Request $request)
425435

426436
$this->beforeRestoreFresh($request, $entity);
427437

428-
$entity = $entity->fresh($requestedRelations);
438+
$entity = $this->runRestoreFetchQuery($request, $entityQuery, $entity->{$this->keyName()});
429439

430440
$this->afterRestore($request, $entity);
431441
}

src/Concerns/HandlesStandardOperations.php

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,9 @@ protected function storeWithTransaction(Request $request)
196196
return $beforeStoreFreshResult;
197197
}
198198

199-
$entity = $entity->fresh($requestedRelations);
199+
$query = $this->buildStoreFetchQuery($request, $requestedRelations);
200+
201+
$entity = $this->runStoreFetchQuery($request, $query, $entity->{$this->keyName()});
200202
$entity->wasRecentlyCreated = true;
201203

202204
$afterSaveHookResult = $this->afterSave($request, $entity);
@@ -251,6 +253,31 @@ protected function performStore(Request $request, Model $entity, array $attribut
251253
$entity->save();
252254
}
253255

256+
/**
257+
* Builds Eloquent query for fetching entity in store method.
258+
*
259+
* @param Request $request
260+
* @param array $requestedRelations
261+
* @return Builder
262+
*/
263+
protected function buildStoreFetchQuery(Request $request, array $requestedRelations): Builder
264+
{
265+
return $this->buildFetchQuery($request, $requestedRelations);
266+
}
267+
268+
/**
269+
* Runs the given query for fetching entity in store method.
270+
*
271+
* @param Request $request
272+
* @param Builder $query
273+
* @param int|string $key
274+
* @return Model
275+
*/
276+
protected function runStoreFetchQuery(Request $request, Builder $query, $key): Model
277+
{
278+
return $this->runFetchQuery($request, $query, $key);
279+
}
280+
254281
/**
255282
* The hook is executed after creating and before refreshing the resource.
256283
*
@@ -443,7 +470,7 @@ protected function updateWithTransaction(Request $request, $key)
443470
return $beforeUpdateFreshResult;
444471
}
445472

446-
$entity = $entity->fresh($requestedRelations);
473+
$entity = $this->runUpdateFetchQuery($request, $query, $key);
447474

448475
$afterSaveHookResult = $this->afterSave($request, $entity);
449476
if ($this->hookResponds($afterSaveHookResult)) {
@@ -585,13 +612,15 @@ protected function destroyWithTransaction(Request $request, $key)
585612

586613
if (!$forceDeletes) {
587614
$this->performDestroy($entity);
615+
588616
if ($softDeletes) {
589617
$beforeDestroyFreshResult = $this->beforeDestroyFresh($request, $entity);
618+
590619
if ($this->hookResponds($beforeDestroyFreshResult)) {
591620
return $beforeDestroyFreshResult;
592621
}
593622

594-
$entity = $entity->fresh($requestedRelations);
623+
$entity = $this->runDestroyFetchQuery($request, $query, $key);
595624
}
596625
} else {
597626
$this->performForceDestroy($entity);
@@ -746,7 +775,7 @@ protected function restoreWithTransaction(Request $request, $key)
746775
return $beforeHookResult;
747776
}
748777

749-
$entity = $entity->fresh($requestedRelations);
778+
$entity = $this->runRestoreFetchQuery($request, $query, $key);
750779

751780
$afterHookResult = $this->afterRestore($request, $entity);
752781
if ($this->hookResponds($afterHookResult)) {

src/Drivers/Standard/QueryBuilder.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ public function buildQuery($query, Request $request)
7777
$actionMethod = $request->route()->getActionMethod();
7878

7979
if (!$this->intermediateMode) {
80-
$this->applyAggregatesToQuery($query, $request);
81-
$this->applyIncludesToQuery($query, $request);
8280
if (in_array($actionMethod, ['index', 'search', 'show'])) {
8381
if ($actionMethod === 'search') {
8482
$this->applyScopesToQuery($query, $request);
@@ -88,6 +86,9 @@ public function buildQuery($query, Request $request)
8886
}
8987
$this->applySoftDeletesToQuery($query, $request);
9088
}
89+
90+
$this->applyIncludesToQuery($query, $request);
91+
$this->applyAggregatesToQuery($query, $request);
9192
}
9293

9394
return $query;

src/Http/Controllers/BaseController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,7 @@ protected function resolveQualifiedRelationFieldName(string $relation, string $f
567567
protected function keyName(): string
568568
{
569569
$resourceModelClass = $this->resolveResourceModelClass();
570+
570571
return (new $resourceModelClass)->getKeyName();
571572
}
572573

src/Http/Controllers/RelationController.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,7 @@ public function setRelation(string $relation): self
115115
*/
116116
public function newRelationQuery(Model $parentEntity)
117117
{
118-
return tap($parentEntity->{$this->getRelation()}(), function ($query) {
119-
$this->relationQueryBuilder->applyFiltersToQuery($query, App::make(Request::class));
120-
$this->relationQueryBuilder->applyIncludesToQuery($query, App::make(Request::class));
121-
});
118+
return $parentEntity->{$this->getRelation()}();
122119
}
123120

124121
/**

tests/Feature/Relations/HasMany/HasManyRelationStandardUpdateOperationsTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public function updating_a_single_relation_resource_with_custom_key(): void
5555
{
5656
$accessKey = factory(AccessKey::class)->create();
5757
$accessKeyScope = factory(AccessKeyScope::class)->create(['access_key_id' => $accessKey->id]);
58-
$payload = ['scope' => 'test updated'];
58+
$payload = ['description' => 'test updated'];
5959

6060
Gate::policy(AccessKeyScope::class, GreenPolicy::class);
6161

@@ -165,4 +165,4 @@ public function updating_a_single_resource_and_getting_included_relation(): void
165165
['company' => $company->toArray()]
166166
);
167167
}
168-
}
168+
}

0 commit comments

Comments
 (0)