Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

HandlesResourceRecordUpdate.php 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace App\Traits;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Support\Facades\Auth;
  5. use Illuminate\Support\Facades\DB;
  6. trait HandlesResourceRecordUpdate
  7. {
  8. protected function handleRecordUpdateWithUniqueField(Model $record, array $data, string|null $uniqueField = null): Model
  9. {
  10. return DB::transaction(function () use ($uniqueField, $record, $data) {
  11. $companyId = Auth::user()->currentCompany->id;
  12. $oldValue = $uniqueField ? $record->{$uniqueField} : null;
  13. $newValue = $uniqueField ? $data[$uniqueField] : null;
  14. $enabled = (bool)($data['enabled'] ?? false);
  15. if ($oldValue !== $newValue && $record->enabled) {
  16. $this->enableAnotherOfSameValue($companyId, $record, $uniqueField, $oldValue);
  17. }
  18. if ($enabled === true) {
  19. $this->disableOthersOfSameValue($companyId, $record, $uniqueField, $newValue);
  20. } elseif ($enabled === false) {
  21. $this->ensureAtLeastOneEnabled($companyId, $record, $uniqueField, $newValue, $enabled);
  22. }
  23. $data['enabled'] = $enabled;
  24. return tap($record)->update($data);
  25. });
  26. }
  27. protected function enableAnotherOfSameValue(int $companyId, Model $record, ?string $uniqueField, $value): void
  28. {
  29. $query = $record::where('company_id', $companyId)
  30. ->where('id', '!=', $record->id)
  31. ->where('enabled', false);
  32. if($uniqueField){
  33. $query->where($uniqueField, $value);
  34. }
  35. $otherRecord = $query->first();
  36. if ($otherRecord) {
  37. $otherRecord->enabled = true;
  38. $otherRecord->save();
  39. }
  40. }
  41. protected function disableOthersOfSameValue(int $companyId, Model $record, ?string $uniqueField, $value): void
  42. {
  43. $query = $record::where('company_id', $companyId)
  44. ->where('id', '!=', $record->id)
  45. ->where('enabled', true);
  46. if($uniqueField){
  47. $query->where($uniqueField, $value);
  48. }
  49. $query->update(['enabled' => false]);
  50. }
  51. protected function ensureAtLeastOneEnabled(int $companyId, Model $record, ?string $uniqueField, $value, bool &$enabled): void
  52. {
  53. $query = $record::where('company_id', $companyId)
  54. ->where('id', '!=', $record->id)
  55. ->where('enabled', true);
  56. if($uniqueField){
  57. $query->where($uniqueField, $value);
  58. }
  59. $enabledCount = $query->count();
  60. if ($enabledCount === 0) {
  61. $enabled = true;
  62. }
  63. }
  64. }