본문 바로가기
Laravel

[Laravel 라라벨] 테이블 간 관계에서 외래 키를 명시해야하는 이유

by bartizan_ 2025. 2. 6.
728x90

🚨 코딩하다 의문점이 생겼는데요.

    public function a(): BelongsTo
    {
        return $this->belongsTo(A::class, 'specific_id');
    }

위처럼 무언가를 정의해줘야할 때가 있더라고요? 아니면 PK 를 제대로 찾지 못하는 이슈가 발생을 했습니다.

냅다 알아보았는데요.


1. 원인 분석

  • 처음에 문제가 발생했던 이유는 Laravel이 A 테이블에서 기본적으로 user_id를 외래 키로 예상했기 때문입니다.
    • Laravel의 기본 규칙: hasMany()나 belongsTo() 관계에서는 현재 모델의 기본 키와 snake_case 형태로 된 외래 키를 자동으로 매핑합니다.
    • 즉, 기본적으로 user_id 컬럼을 찾으려 하다가, 해당 컬럼이 없어서 Unknown column 'user_id' 오류가 발생한 것입니다.

2. 왜 외래 키를 명시하면 해결되는가

return $this->hasMany(A::class, 'specific_id');
  • therapist_id를 명시함으로써, Eloquent은 A 테이블에서 외래 키로 specific_id 컬럼을 사용하도록 지시합니다.
  • 이제 Laravel은 specific_id를 기준으로 테이블을 조인하여 데이터를 올바르게 가져올 수 있습니다.

3. 관계의 동작 방식

  • hasMany() 메서드는 기본적으로 다음과 같은 쿼리를 생성합니다:
SELECT * FROM A WHERE specific_id = ?
  • 외래 키를 명시하지 않으면 기본적으로 아래와 같은 쿼리를 생성하려고 시도합니다:
SELECT * FROM A WHERE user_id = ?
  • 테이블에 specific_id가 없기 때문에 오류가 발생한 것이죠.

4. 요약

  • Laravel에서는 테이블 간 관계에서 외래 키를 명시해야만 Eloquent가 올바른 키를 사용하여 데이터를 가져올 수 있습니다.
  • 명시하지 않으면 모델명에 따른 기본 규칙(specific_id)에 따라 키를 찾기 때문에 오류가 발생할 수 있습니다.
  • 따라서 외래 키가 기본 규칙과 다르다면 반드시 관계 정의에서 두 번째 인자로 외래 키를 설정해주어야 합니다.

보편적인 FK가 아닌 경우엔 정확히 명시를 해주어야 한다!

 

 

728x90

댓글