You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.6KB

  1. <?php
  2. namespace App\Models;
  3. use App\Events\Model\CreatedEvent;
  4. use App\Events\Model\CreatingEvent;
  5. use App\Events\Model\DeletedEvent;
  6. use App\Events\Model\UpdatingEvent;
  7. use App\Models\Feature\IModelFeature;
  8. use Illuminate\Database\Eloquent\Factories\HasFactory;
  9. use Illuminate\Database\Eloquent\Model;
  10. use Illuminate\Database\Query\Builder;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Str;
  13. /**
  14. * @mixin \Eloquent
  15. */
  16. abstract class BaseModel extends Model implements IModelFeature
  17. {
  18. use HasFactory;
  19. const COL_NAME_ID = ColumnName::ID;
  20. const COL_NAME_CREATED_BY = ColumnName::CREATED_BY;
  21. const COL_NAME_UPDATED_BY = ColumnName::UPDATED_BY;
  22. const COL_NAME_CREATED_AT = ColumnName::CREATED_AT;
  23. const COL_NAME_UPDATED_AT = ColumnName::UPDATED_AT;
  24. const COL_NAME_DELETED_AT = ColumnName::DELETED_AT;
  25. protected $guarded = [
  26. self::COL_NAME_ID,
  27. self::COL_NAME_CREATED_BY,
  28. self::COL_NAME_UPDATED_BY,
  29. self::COL_NAME_CREATED_AT,
  30. self::COL_NAME_UPDATED_AT,
  31. self::COL_NAME_DELETED_AT,
  32. ];
  33. public static function getBuilder(string $name = 'main'): Builder
  34. {
  35. return DB::table(static::getTableName(), $name)
  36. ->whereNull($name . "." . static::COL_NAME_DELETED_AT);
  37. }
  38. public static function getTableName(): string
  39. {
  40. return (new static)->getTable();
  41. }
  42. public static function hasColumn(string $columnName): bool
  43. {
  44. $target = sprintf("%s::COL_NAME_%s", static::class, Str::upper($columnName));
  45. $ret = defined($target);
  46. return $ret;
  47. }
  48. public function copy(IModelFeature $from): static
  49. {
  50. $data = $from->getAttributeKeys();
  51. foreach ($data as $key) {
  52. $this->$key = $from->$key;
  53. }
  54. return $this;
  55. }
  56. public function getAttributeKeys(): array
  57. {
  58. return array_values(array_unique(array_merge(array_keys($this->attributesToArray()), $this->hidden)));
  59. }
  60. public function isNotSavedModel(): bool
  61. {
  62. return data_get($this, ColumnName::ID) === null;
  63. }
  64. protected $dispatchesEvents = [
  65. 'creating' => CreatingEvent::class,
  66. 'created' => CreatedEvent::class,
  67. 'updating' => UpdatingEvent::class,
  68. 'deleted' => DeletedEvent::class,
  69. ];
  70. // カラムが存在する項目のみfillするようオーバーライド
  71. public function fill(array $atr)
  72. {
  73. $filterd = array_filter($atr, function ($value, $key) {
  74. return static::hasColumn($key);
  75. }, ARRAY_FILTER_USE_BOTH);
  76. return parent::fill($filterd);
  77. }
  78. }