您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

HandlesResourceRecordCreation.php 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace App\Concerns;
  3. use App\Models\User;
  4. use BackedEnum;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Model;
  7. trait HandlesResourceRecordCreation
  8. {
  9. protected function handleRecordCreationWithUniqueField(array $data, Model $model, User $user, ?string $uniqueField = null, ?array $evaluatedTypes = null): Model
  10. {
  11. if (is_array($evaluatedTypes)) {
  12. $evaluatedTypes = $this->ensureCreationEnumValues($evaluatedTypes);
  13. }
  14. if ($uniqueField && ! in_array($data[$uniqueField] ?? '', $evaluatedTypes ?? [], true)) {
  15. $data['enabled'] = false;
  16. $instance = $model->newInstance($data);
  17. $instance->save();
  18. return $instance;
  19. }
  20. $companyId = $user->currentCompany->id;
  21. $shouldBeEnabled = (bool) ($data['enabled'] ?? false);
  22. $query = $model::query()
  23. ->where('company_id', $companyId)
  24. ->where('enabled', true);
  25. if ($uniqueField && array_key_exists($uniqueField, $data)) {
  26. $query->where($uniqueField, $data[$uniqueField]);
  27. }
  28. $this->toggleRecords($query, $shouldBeEnabled);
  29. $data['enabled'] = $shouldBeEnabled;
  30. $instance = $model->newInstance($data);
  31. $instance->save();
  32. return $instance;
  33. }
  34. private function ensureCreationEnumValues(array $evaluatedTypes): array
  35. {
  36. return array_map(static function ($type) {
  37. return $type instanceof BackedEnum ? $type->value : $type;
  38. }, $evaluatedTypes);
  39. }
  40. private function toggleRecords(Builder $query, bool &$shouldBeEnabled): void
  41. {
  42. if ($shouldBeEnabled) {
  43. $existingEnabledRecord = $query->first();
  44. $existingEnabledRecord?->update(['enabled' => false]);
  45. } elseif ($query->doesntExist()) {
  46. $shouldBeEnabled = true;
  47. }
  48. }
  49. }