Laravel에서 모델 간의 관계는 연결된 데이터를 구성하고 작업하는 데 필수적입니다. 일반적으로 우리는 User 모델과 Post 모델 사이의 다른 모델 사이의 관계를 정의합니다(예: 사용자는 많은 게시물을 가질 수 있습니다). 하지만 때로는 모델이 자신과 관련된 관계를 만들어야 할 때도 있습니다. 이를 자기지시관계 또는 자기관계라고 합니다.
이제 간단한 실제 사례와 코드 조각을 사용하여 이러한 관계가 필요한 이유를 설명하겠습니다.
자기 관계는 개체가 같은 종류의 다른 개체와 관련될 수 있을 때 발생합니다. 각 직원에게 관리자가 있는 조직을 관리한다고 상상해 보세요. 하지만 매니저도 직원이에요! 이 경우 직원을 다른 직원과 연결해야 하는데, 이는 동일한 모델의 인스턴스 간 관계를 생성하는 것을 의미합니다.
자기 관계는 데이터가 동일한 유형의 다른 데이터를 참조해야 하는 상황에서 유용합니다. 몇 가지 일반적인 시나리오는 다음과 같습니다.
직원과 관리자라는 일반적인 예를 사용하여 코드로 분류해 보겠습니다.
먼저 직원들에게 모델이 필요합니다. Laravel에서는 테이블 구조를 정의하기 위해 마이그레이션을 통해 이를 생성합니다.
php artisan make:model Employee -m
이 명령은 직원 모델과 해당 마이그레이션 파일을 모두 생성합니다.
다음으로 테이블 구조를 정의합니다. 여기에는 직원의 세부 정보에 대한 열과 직원의 관리자(직원이기도 한) ID를 저장하는 열(manager_id)이 필요합니다.
이전 파일(예: 2024_09_24_000000_create_employees_table.php)에서 다음과 같이 구조를 정의합니다.
Schema::create('employees', function (Blueprint $table) { $table->id(); // Employee ID $table->string('name'); // Employee name $table->foreignId('manager_id')->nullable()->constrained('employees'); // Self-referencing $table->timestamps(); });
마이그레이션을 실행하여 테이블을 만듭니다.
php artisan migrate
다음으로 직원 모델 자체 내에서 관계를 정의합니다.
Employee.php 모델 파일에서:
class Employee extends Model { protected $fillable = ['name', 'manager_id']; // An employee belongs to a manager (who is also an employee) public function manager() { return $this->belongsTo(Employee::class, 'manager_id'); } // An employee can have many subordinates (other employees) public function subordinates() { return $this->hasMany(Employee::class, 'manager_id'); } }
우리가 한 일은 다음과 같습니다.
이제 이러한 관계를 실제로 어떻게 활용할 수 있는지 살펴보겠습니다.
3명의 직원이 있다고 가정해 보겠습니다. Alice(CEO), Bob(관리자), Charlie(Bob에게 보고하는 직원)
다음과 같이 추가할 수 있습니다.
// Creating Alice (CEO, no manager) $alice = Employee::create(['name' => 'Alice']); // Creating Bob, who reports to Alice $bob = Employee::create(['name' => 'Bob', 'manager_id' => $alice->id]); // Creating Charlie, who reports to Bob $charlie = Employee::create(['name' => 'Charlie', 'manager_id' => $bob->id]);
$bob = Employee::where('name', 'Bob')->first(); echo $bob->manager->name; // Outputs "Alice"
$alice = Employee::where('name', 'Alice')->first(); foreach ($alice->subordinates as $subordinate) { echo $subordinate->name; // Outputs "Bob" }
$bob = Employee::where('name', 'Bob')->first(); foreach ($bob->subordinates as $subordinate) { echo $subordinate->name; // Outputs "Charlie" }
또 다른 예는 카테고리와 하위 카테고리입니다. 각 카테고리에 하위 카테고리가 있을 수 있는 자체 참조 카테고리 모델을 생성할 수 있습니다.
class Category extends Model { public function parentCategory() { return $this->belongsTo(Category::class, 'parent_id'); } public function subCategories() { return $this->hasMany(Category::class, 'parent_id'); } }
이를 통해 다음과 같이 카테고리가 중첩된 시스템을 모델링할 수 있습니다.
직원 예시와 비슷한 방식으로 상위 카테고리와 하위 카테고리를 조회할 수 있습니다.
In a social networking app, users might have other users as friends. You can model this with a self-relationship on the User model.
class User extends Model { public function friends() { return $this->belongsToMany(User::class, 'user_friend', 'user_id', 'friend_id'); } }
This allows each user to have a list of friends who are also users.
Self-referential relationships are a powerful feature in Laravel for situations where data is related to other data of the same type. Whether you're modeling employee-manager hierarchies, category-subcategory structures, or friendships, self-relationships allow you to handle these kinds of relationships cleanly and efficiently.
By creating relationships to the same model, you can keep your data organized and easily query hierarchical or connected information with a few simple lines of code. Whether you're building an organizational chart, a category tree, or a social network, self-relationships in Laravel provide the flexibility you need.
위 내용은 Laravel 모델의 자기 관계 이해: 간단한 안내서의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!