From 97b765b5cc45db28e24b1f8a2dc7a8d6aa985ba1 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 7 Jan 2025 15:06:09 -0800 Subject: [PATCH] improved reports query, could be further optimized --- app/Http/Controllers/ReportsController.php | 57 ++++++++++++---------- app/Http/Traits/CheckoutableTrait.php | 24 --------- app/Models/Asset.php | 2 - app/Models/CheckoutAcceptance.php | 2 - 4 files changed, 30 insertions(+), 55 deletions(-) delete mode 100644 app/Http/Traits/CheckoutableTrait.php diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 4b50b4e74..99f7fdfcc 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -11,6 +11,7 @@ use App\Models\AssetModel; use App\Models\Category; use App\Models\AssetMaintenance; use App\Models\CheckoutAcceptance; +use App\Models\Company; use App\Models\CustomField; use App\Models\Depreciation; use App\Models\License; @@ -18,6 +19,7 @@ use App\Models\ReportTemplate; use App\Models\Setting; use App\Notifications\CheckoutAssetNotification; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Mail; @@ -1109,43 +1111,44 @@ class ReportsController extends Controller $this->authorize('reports.view'); $showDeleted = $deleted == 'deleted'; +// $acceptances = CheckoutAcceptance::pending() +// ->where('checkoutable_type', 'App\Models\Asset') +// ->withTrashed() +// ->with([ +// 'assignedTo', +// 'checkoutable.assignedTo', +// 'checkoutable.model' +// ])->get(); $assetsForReport = collect(); $query = CheckoutAcceptance::pending() ->where('checkoutable_type', 'App\Models\Asset') - ->with(['checkoutable.assignedTo', 'checkoutable.model']); // Eager load common relationships + ->with([ + 'checkoutable' => function (MorphTo $query) { + $query->morphWith([ + AssetModel::class => ['model'], + Company::class => ['company'], + Asset::class => ['assignedTo'], + ])->with('model.category'); + }, + 'assignedTo' => function($query){ + $query->withTrashed(); + } + ]); if ($showDeleted) { - $query->withTrashed()->with(['assignedTo']); - } - else { - $query->with(['assignedTo' => function ($query) { - $query->withTrashed(); - }]); + $query->withTrashed(); } -// Process records in chunks - $query->chunk(100, function ($chunk) use (&$assetsForReport) { - - $filtered = $chunk->filter(function ($acceptance) { - $acceptance_checkoutable_flag = false; - - if ($acceptance->checkoutable){ - $acceptance_checkoutable_flag = $acceptance->checkoutable->assignedTo(); - } - // Return true if user - return $acceptance->checkoutable_type === 'App\Models\Asset' && $acceptance_checkoutable_flag; - })->map(function ($acceptance) { - - return [ - 'assetItem' => $acceptance->checkoutable, - 'acceptance' => $acceptance, - ]; + $assetsForReport = $query->get() + ->map(function ($acceptance) { + return [ + 'assetItem' => $acceptance->checkoutable, + 'acceptance' => $acceptance, + ]; }); - // Merge results into the main collection - $assetsForReport = $assetsForReport->merge($filtered); - }); + return view('reports/unaccepted_assets', compact('assetsForReport','showDeleted' )); } diff --git a/app/Http/Traits/CheckoutableTrait.php b/app/Http/Traits/CheckoutableTrait.php deleted file mode 100644 index f97e18ea4..000000000 --- a/app/Http/Traits/CheckoutableTrait.php +++ /dev/null @@ -1,24 +0,0 @@ -assignedType() === self::USER; - } - - public function checkedOutToLocation(): bool - { - return $this->assignedType() === self::LOCATION; - } - - public function checkedOutToAsset(): bool - { - return $this->assignedType() === self::ASSET; - } -} \ No newline at end of file diff --git a/app/Models/Asset.php b/app/Models/Asset.php index 839f0ac22..ce8b870eb 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -5,7 +5,6 @@ namespace App\Models; use App\Events\CheckoutableCheckedOut; use App\Exceptions\CheckoutNotAllowed; use App\Helpers\Helper; -use App\Http\Traits\CheckoutableTrait; use App\Http\Traits\UniqueUndeletedTrait; use App\Models\Traits\Acceptable; use App\Models\Traits\Searchable; @@ -34,7 +33,6 @@ class Asset extends Depreciable protected $with = ['model', 'adminuser']; use CompanyableTrait; - use CheckoutableTrait; use HasFactory, Loggable, Requestable, Presentable, SoftDeletes, ValidatingTrait, UniqueUndeletedTrait; public const LOCATION = 'location'; diff --git a/app/Models/CheckoutAcceptance.php b/app/Models/CheckoutAcceptance.php index 69afc3c85..e44a330eb 100644 --- a/app/Models/CheckoutAcceptance.php +++ b/app/Models/CheckoutAcceptance.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Http\Traits\CheckoutableTrait; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -12,7 +11,6 @@ use Illuminate\Notifications\Notifiable; class CheckoutAcceptance extends Model { use HasFactory, SoftDeletes, Notifiable; - use CheckoutableTrait; protected $casts = [ 'accepted_at' => 'datetime',