개발
Laravel 6.x
라라벨 릴레이션 디폴트 모델 지정
34 views as of November 26, 2024.
라라벨을 사용하다보면 모델(Model)간의 관계(Relation)를 자주 사용한다.
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 : 1 | hasOne |
1 : n | hasMany |
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
개의 댓글
Collection. Laravel 6.x
01.
라라벨에서 ajax로 FormData 넘길때 method에 의해 발생할 수 있는 오류
2021
02.
PHPStorm 라라벨 로컬 서버 환경 설정 값
2021
03.
라라벨에서 쿠키를 이용한 손쉬운 조회수 기능 추가
2024
04.
라라벨에서 세션을 이용한 손쉬운 조회수 기능 추가
2024
05.
라라벨 에러 페이지 수정 및 커스터마이징
2024
06.
라라벨에서 AWS SDK를 설치했을때 나오는 PHP 버전 에러 우회 방법
2024
07.
라라벨에서 IndexNow 사용법
2024
08.
동적 목차(ToC) 구현
2024
09.
라라벨 Permissions-Policy 헤더 추가 하는 방법
2024
10.
라라벨 구버전에서 pagination link http 문제 해결 (proxy 환경)
2024
11.
라라벨 블레이드 템플릿(Blade Template) Json 파싱
2024
12.
라라벨 스로틀 미들웨어로 접근 제한 걸기
2024
13.
라라벨에서 한 화면에 2개의 페이징 붙이는 법
2024
14.
라라벨 릴레이션 디폴트 모델 지정
2024