ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라라벨에서 hasOneOfMany 관계를 활용한 예시
    백엔드/laravel 2024. 1. 26. 13:45

     

    라라벨에서 제공하는 "hasOneOfMany" 관계를 설명하는 예시로, 사용자(User)와 직업(Job) 모델을 가정한 상황입니다.

     

    Job 모델과 마이그레이션 생성:

        Artisan 명령어를 사용하여 Job 모델과 해당 모델에 대한 마이그레이션을 생성합니다.

     

        php artisan make:model Job -m

     

    Job 테이블 구조 정의:

        Job 마이그레이션 파일에서 title, description, user_id, active 등 필요한 컬럼을 정의합니다.

       

        public function up(): void
        {
            Schema::create('jobs', function (Blueprint $table) {
                $table->id();
                $table->string(column: 'title');
                $table->text(column: 'description');
                $table->foreignId(column: 'user_id')
                    ->constrained(table: 'users')
                    ->cascadeOnDelete();
                $table->boolean(column: 'active')->default(value: false);
                $table->timestamps();
            });
        }

     

     

    php artisan migrate;

     

     

    User 모델에 hasOneOfMany 관계 정의:

    User 모델에서 두 가지 메서드(latestJob 및 oldestJob)를 정의하여 hasOneOfMany 관계를 설정합니다.

     

    class User extends Model
    {
        /**
         * 최신 직업을 가져오는 관계 설정 메서드
         */
        public function latestJob(): HasOne
        {
            return $this->hasOne(related: Job::class)->latestOfMany();
        }

        /**
         * 가장 오래된 직업을 가져오는 관계 설정 메서드
         */
        public function oldestJob(): HasOne
        {
            return $this->hasOne(related: Job::class)->oldestOfMany();
        }
    }

     

     

    class Job extends Model
    {
        use HasFactory;

        protected $fillable = ['title', 'description', 'user_id', 'active'];
    }

     

     

    php artisan Tinker;

    ------------------------

    > User::find(7)->latestJob()->get();

    > User::find(7)->oldestJob()->get();

     

    $user = User::find(17);
    $job1 = $user->latestJob; // 최신 직업 조회
    $job2 = $user->oldestJob; // 가장 오래된 직업 조회

    dd($job1->toArray(), $job2->toArray());

     

     

     

     

     

    댓글

Designed by Tistory.