개발
Laravel 6.x

라라벨 릴레이션 디폴트 모델 지정

34 views as of November 26, 2024.
라라벨을 사용하다보면 모델(Model)간의 관계(Relation)를 자주 사용한다.

Laravel - The PHP Framework For Web Artisans
Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.
https://laravel.com/docs/11.x/eloquent-relationships

뭐 쉽게말하면 2개의 모델간의 관계성을 지정하고 A 모델에서 B 모델에 접근하는 쉬운 메소드(지시자)라고 보면된다.


대표적으로 사용하는 경우가 Post-Comment 관계이다.

쉽게 생각하기 편한 관계로 1개의 Post는 여러개의 Comment를 가질수 있다.
즉 1:n 관계를 가지고 있고 이를 라라벨 릴레이션에서는 hasMany 메소드를 통해 구현한다.

관계메소드
1 : 1hasOne
1 : nhasMany
1 : 1 (역방향)belongsTo


근데 실제로 이 릴레이션을 사용하면 제일 많이 발생하는 문제가 릴레이션으로 조회하는 모델이 없을경우 발생하는 500에러이다.

생각보다 별로 안일어날거같지만 실제로 개발을 하다보면 삭제기능을 많이 만드는데, 이때 서로 릴레이션이 얽혀있는 레코드끼리 삭제 연동을 시켜놓지 않으면 맞는 모델을 찾을 수 없어 에러가 많이 뜬다.

특히 실전에서는 예를들어 회원이 탈퇴했다고 그 회원이 남긴글을 싹 지울수가없다보니 보통 글쓴이 이름을 가져오는 릴레이션 단계에서 삭제된 회원의 정보를 접근하지못해 뜨는 에러가 많다.

이럴때 예외 처리를 하는방법이 아래 withDefault 방식이다.

public function post()
{
    return $this->belongsTo('App\Models\Post')->withDefault([
        'id' => 0, // 더미 ID
        'title' => 'Dummy Post', // 기본 제목
        'content' => 'This is a placeholder post.', // 기본 내용
    ]);
}Copy

해당 모델이 존재하지않으면 내가 임의의 더미모델을 지정해서 반환할 수 있다.
만약에 더미모델을 필요에 따라 변수처리로 운용하려면,

public function post()
{
    return $this->belongsTo('App\Models\Post')->withDefault(function ($post) {
        $dummyPost = Post::fetchPostByDummyId($this->post_id);

        $post->id = $dummyPost->id;
        $post->title = $dummyPost->title;
    });
}Copy

이 방식처럼 콜백함수로 하면 동적으로도 디폴트 모델을 반환할 수 있다.


왜 이렇게 2가지 방식이 잇냐면 기본적으로 withDefault는 지연 실행(lazy evalutation) 방식으로 동작하지않고, 최초 설정값에의해 고정된 데이터를 받아 구현되기 때문이다.

이때 콜백함수를쓰면 해당 릴레이션이 호출될때 withDefault가 실행되도록 운용할 수 있다.

#개발 #라라벨 #Laravel #릴레이션 #Relation #모델 #Model
0 개의 댓글
×