Laravel 9 Eloquent: 다대다 관계
케이스
사례 1: 중간/피벗 테이블을 시드하려고 할 때 "테이블을 찾을 수 없음":
사례 2: 피벗 테이블에 대한 마이그레이션 실패
사례 3: Laravel에서 3방향 피벗 테이블 구현에 대한 정보 찾기
해결하자
좋아, 당신은 당신의 테이블이 many-to-many relationship을 가지고 있다는 것을 알아냈고 이제 그것을 Laravel에서 구현해야 합니다. 이론적으로 Laravel은 중간/피벗 테이블에 대한 모델이 필요하지 않으며 상위 모델의 다대다 관계로 충분하다고 설명합니다.
그러나 나는 궁극적으로 그것들을 만드는 것이 더 쉽거나 필요하다는 것을 알게 된 여러 상황에 직면했습니다.
Laravelnaming conventions을 테이블과 모델에 적용하면 Laravel은 모델에 올바른 관계가 명시되어 있는 경우 어떤 테이블이 중간 테이블인지 자동으로 이해합니다. Laravel 문서는 이를 구현하는 방법에 대한 명확한 지침을 제공합니다.
사례 1 "테이블을 찾을 수 없음"
내 프로젝트에는 중간 테이블 "tea_user"가 있는 "users"및 "teas"테이블이 있습니다.
여기서 명명 규칙은 다음과 같습니다. 사이에 밑줄이 있는 알파벳 순서로 상위 테이블의 단수 이름을 사용합니다.
사례 1: 중간 테이블을 시드하려고 할 때 "테이블을 찾을 수 없음"오류:
시더는 기본적으로 모델의 복수형 이름을 찾습니다. 따라서 테이블 이름이 마이그레이션에서 올바르게 언급된 경우에도 시드 명령을 실행할 때 존재하지 않는다는 오류가 발생합니다.
이에 대한 두 가지 쉬운 솔루션을 찾았습니다.
중간 테이블에 대한 모델을 생성하고 다음 줄을 추가합니다.
공개 $table = "name_table";
class TeaUser extends Model
{
use HasFactory;
public $table = "tea_user";
}
또는 "이름 사용자 정의"에 대한 Laravel 문서의 지침을 사용하지만 더 짧은 방법은 다음과 같습니다.
class User extends Model
public function methodName()
{
return $this->belongsToMany(Name::class, 'tea_user');
}
사례 2 "피벗 테이블 마이그레이션 실패"
중간 이전에 상위 테이블 마이그레이션을 생성했는지 확인하십시오. 그렇지 않으면 마이그레이션 명령을 실행할 때 실패 메시지가 표시됩니다. 외래 키의 출처를 인식하지 못하기 때문입니다.
또한 외래 키 열과 참조 열은 동일한 유형이어야 합니다.
예를 들어 id 열의 기본 유형은 큰 정수이므로 외래 키는 'unsignedBigInteger'여야 합니다.
public function up()
{
Schema::create('tea_user', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('tea_id');
$table->unsignedBigInteger('collection_id');
$table->timestamps();
});
}
사례 3 "3방향 피벗 테이블 구현 및 직접 작업"
이에 대한 모델을 만듭니다.
$ php artisan make:model User -m
그리고 그 안의 다른 각 상위 테이블과 다대다 관계를 추가합니다.
class CollectionTeaUser extends Model
{
use HasFactory;
public function intermUsers()
{
return $this->belongsToMany(User::class, 'collection_tea_user');
}
public function intermTeas()
{
return $this->belongsToMany(Tea::class, 'collection_tea_user');
}
public function intermCollections()
{
return $this->belongsToMany(Collection::class, 'collection_tea_user');
}
}
서로 다 대다 관계를 갖는 세 개의 상위 테이블을 포함하는 데이터베이스의 다른 부분에 필요했습니다.
3-way intermediate table에 대한 좋은 설정을 찾다가 찾은 정보입니다. 나에게 내가 찾은 유일한 리소스는 Kaism 덕분에 이 주제에 대해 명확하고 요지였습니다!
아, many-to-many relationships에 대한 Laravel 문서를 계속 읽으면 다음과 같은 유용한 정보를 발견하게 될 것입니다.
기본적으로 모델 키만 피벗 모델에 표시됩니다. 중간 테이블에 추가 속성(열)이 포함된 경우 관계를 정의할 때 이를 지정해야 합니다.
또한 중간 테이블에 Eloquent가 자동으로 유지 관리하는 "created_at"및 "updated_at"타임스탬프를 갖고 싶다면 관계를 정의할 때 "withTimestamps"메서드를 호출하세요.
return $this->belongsToMany(User::class, 'tea_user')
->withTimestamps();
그런 다음 해당 열을 만드는 것을 잊지 마십시오!
그게 다야, 행운을 빕니다!
Reference
이 문제에 관하여(Laravel 9 Eloquent: 다대다 관계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cynthiacddc/laravel-9-eloquent-many-to-many-relationships-4dp2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)