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

SyncAssociatedModels.php 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Listeners;
  3. use App\Events\CompanyDefaultUpdated;
  4. use App\Models\Setting\CompanyDefault;
  5. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  6. use Illuminate\Support\Facades\DB;
  7. class SyncAssociatedModels
  8. {
  9. /**
  10. * Create the event listener.
  11. */
  12. public function __construct()
  13. {
  14. //
  15. }
  16. /**
  17. * Handle the event.
  18. */
  19. public function handle(CompanyDefaultUpdated $event): void
  20. {
  21. DB::transaction(function () use ($event) {
  22. $this->syncAssociatedModels($event);
  23. }, 5);
  24. }
  25. private function syncAssociatedModels(CompanyDefaultUpdated $event): void
  26. {
  27. /** @var CompanyDefault $record */
  28. $record = $event->record;
  29. $data = $event->data;
  30. $record_array = array_map('strval', $record->toArray());
  31. $data = array_map('strval', $data);
  32. $diff = array_diff_assoc($data, $record_array);
  33. $keyToMethodMap = [
  34. 'bank_account_id' => 'bankAccount',
  35. 'sales_tax_id' => 'salesTax',
  36. 'purchase_tax_id' => 'purchaseTax',
  37. 'sales_discount_id' => 'salesDiscount',
  38. 'purchase_discount_id' => 'purchaseDiscount',
  39. ];
  40. foreach ($diff as $key => $value) {
  41. if (array_key_exists($key, $keyToMethodMap)) {
  42. $method = $keyToMethodMap[$key];
  43. $this->updateEnabledStatus($record->$method(), $value);
  44. }
  45. }
  46. }
  47. private function updateEnabledStatus(BelongsTo $relation, $newValue): void
  48. {
  49. if ($relation->exists()) {
  50. $previousDefault = $relation->getResults();
  51. $previousDefault->update(['enabled' => false]);
  52. }
  53. if ($newValue !== null) {
  54. $newDefault = $relation->getRelated()->newQuery()->where($relation->getOwnerKeyName(), $newValue)->first();
  55. $newDefault?->update(['enabled' => true]);
  56. }
  57. }
  58. }