백엔드/laravel

라라벨에서 hasOneOfMany 관계를 활용한 예시

janggos 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());