백엔드/laravel

라라벨 Eloquent one-to-one Relationship

janggos 2024. 1. 21. 15:29

 

// User 모델, contact 를 단수명사 표현

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];

    public function contact()
    {

        return $this->hasOne(Contact::class);  // 또는
        return $this->hasOne(Contact::class, 'user_id', 'id');
    }
}

 

hasOne 메서드는 Laravel Eloquent에서 1:1 관계를 정의하는 데 사용됩니다.

이 관계에서 하나의 모델이 다른 모델을 소유하는 경우에 사용됩니다.

hasOne 메서드는 주로 외래 키가 소유되는 모델에 위치할 때 사용됩니다.

다음은 hasOne 메서드를 사용하여 1:1 관계를 설정하는 간단한 예제입니다.

이 예제에서는 User 모델이 하나의 Contact 모델을 소유하고 있다고 가정합니다.

 

이 코드에서 주목해야 할 몇 가지 포인트가 있습니다:

  1. hasOne 메서드:
    • hasOne 메서드는 1:1 관계를 정의하는 데 사용됩니다.
    • 이 메서드는 현재 모델(User)이 소유한(Contact) 모델을 지정합니다.
  2. 관련된 모델 및 외래 키 지정:
    • Contact::class: 이 메서드는 현재 모델(User)이 소유한(Contact) 모델을 지정합니다.
    • 'user_id': 외래 키로 사용될 Contact 모델의 컬럼 이름을 나타냅니다.
    • 'id': 관련된 모델(User)의 주 키 컬럼 이름을 나타냅니다.

이제 위 코드를 사용하여 특정 User에 속한 Contact를 검색할 수 있습니다.

$user = User::find(1);
$contact = $user->contact; // User 모델의 contact 메서드를 통해 Contact 모델을 검색

 

 

// Contact  모델, user() 단수명사 표현

class Contact extends Model
{
    protected $fillable = ['address', 'number', 'city', 'zip_code'];

    public function user()
    {

        return $this->belongsTo(User::class);  // 또는
        return $this->belongsTo(User::class, 'user_id', 'id');
    }
}

 

belongsTo 메서드는 Laravel Eloquent에서 역방향(Reverse) 1:1 관계를 정의하는 데 사용됩니다.

이 관계에서 하나의 모델이 다른 모델을 소유하는 경우에 사용됩니다.

보통 외래 키는 소유되는 모델에 속해 있습니다.

다음은 belongsTo 메서드를 사용하여 역방향 1:1 관계를 설정하는 간단한 예제입니다.

이 예제에서는 User 모델이 하나의 Contact 모델을 소유하고 있다고 가정합니다.

 

이 코드에서 주목해야 할 몇 가지 포인트가 있습니다:

  1. belongsTo 메서드:
    • belongsTo 메서드는 1:1 관계에서 역방향 관계를 정의하는 데 사용됩니다.
  2. 관련된 모델 및 외래 키 지정:
    • User::class: 이 메서드는 현재 모델(Contact)이 속한(User) 모델을 지정합니다.
    • 'user_id': 외래 키로 사용될 Contact 모델의 컬럼 이름을 나타냅니다.
    • 'id': 관련된 모델(User)의 주 키 컬럼 이름을 나타냅니다.

이제 위 코드를 사용하여 특정 Contact의 소유주(User)를 검색할 수 있습니다.

$contact = Contact::find(1);
$user = $contact->user; // Contact 모델의 user 메서드를 통해 User 모델을 검색

 

 

php artisan Tinker 엔터

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

$user = User::create([...]);

$user->contact()->create([...]);

 

User::with('contact')->find(27);

 

$user = User::find(27);

$user->contact->address;