수색…


관계에 대한 질의

또한 Eloquent를 사용하면 아래에 표시된 것처럼 정의 된 관계에 대해 쿼리 할 수 ​​있습니다.

User::whereHas('articles', function (Builder $query) {
    $query->where('published', '!=', true);
})->get();

이 경우 관계 메소드 이름이 articles 이어야합니다. 클로저에 전달 된 인수는 관련 모델의 쿼리 작성기이므로 여기에서 쿼리를 사용할 수 있습니다.

열망하는로드

사용자 모델이 기사 모델과의 관계가 있고 관련 기사를 열렬하게로드하려고한다고 가정합니다. 즉, 사용자를 검색하는 동안 사용자의 기사가로드됩니다.

articles 는 사용자 모델의 관계 이름 (메소드)입니다.

User::with('articles')->get();

여러 관계가있는 경우 예를 들어 기사 및 게시물.

User::with('articles','posts')->get();

중첩 된 관계를 선택하려면

User::with('posts.comments')->get();

하나 이상의 중첩 된 관계 호출

User::with('posts.comments.likes')->get()

관련 모델 삽입

CommenthasMany 관계가있는 Post 모델이 있다고 가정합니다. 다음을 수행하여 게시물과 관련된 Comment 객체를 삽입 할 수 있습니다.

$post = Post::find(1);

$commentToAdd = new Comment(['message' => 'This is a comment.']);

$post->comments()->save($commentToAdd);

saveMany 함수를 사용하여 여러 모델을 한 번에 저장할 수 있습니다.

$post = Post::find(1);

$post->comments()->saveMany([
    new Comment(['message' => 'This a new comment']),
    new Comment(['message' => 'Me too!']),
    new Comment(['message' => 'Eloquent is awesome!'])
]);

또는 Eloquent 모델 인스턴스 대신 일반 PHP 배열을 사용할 create 있는 create 메소드가 있습니다.

$post = Post::find(1);

$post->comments()->create([
    'message' => 'This is a new comment message'
]);

소개

Eloquent 관계는 Eloquent 모델 클래스의 함수로 정의됩니다. Eloquent 모델 자체와 마찬가지로 관계도 강력한 쿼리 작성기로 사용되므로 관계를 함수로 정의하면 강력한 메서드 체인 및 쿼리 기능을 제공합니다. 예를 들어이 게시물 관계에 추가 제약 조건을 연결할 수 있습니다.

$user->posts()->where('active', 1)->get();

상위 주제로 이동

관계 유형

일대 다

각 게시물에는 하나 이상의 댓글이있을 수 있으며 각 댓글은 하나의 게시물에만 속한다고합니다.

코멘트 테이블은 post_id 가지게됩니다. 이 경우 관계는 다음과 같습니다.

모델 게시

public function comments()
{
   return $this->belongsTo(Post::class);
}

외래 키가 post_id 가 아닌 경우, 예를 들어 외래 키는 example_post_id 입니다.

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id');
}

그리고 로컬 키가 id 가 아닌 경우, 예를 들어 로컬 키가 other_id

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}

댓글 모델

1 대 다수의 역수 정의

public function post()
{
   return $this->hasMany(Comment::class);
}

1-1

두 모델을 연결하는 방법 (예 : UserPhone 모델)

App\User

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('Phone::class', 'foreign_key', 'local_key');
    }
}

App\Phone

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('User::class', 'foreign_key', 'local_key');
    }
}

foreign_key : 기본적으로 other_model_name_id 는이 값을 other_model_name_id 가정합니다 (이 경우 user_idphone_id ). 그렇지 않은 경우 변경하십시오.

local_key : 기본적으로 local_key 는이 값을 id (현재 모델 기본 키)로 가정하고, 그렇지 않은 경우 변경합니다.

데이터베이스가 laravel 표준에 따라 이름을 저장 한 경우 관계 선언에 외래 키와 로컬 키를 제공 할 필요가 없습니다

설명

다 대다

역할과 권한이 있다고 가정 해 보겠습니다. 각 역할은 많은 권한에 속할 수 있으며 각 권한은 여러 역할에 속할 수 있습니다. 그래서 3 개의 테이블이있을 것입니다. 두 개의 모델과 하나의 피벗 테이블. roles , userspermission_role 테이블

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

참고 : 1

피봇 테이블에 다른 테이블 이름을 사용하는 동안 다음을 고려하십시오.

eloquent가 피벗 키 이름을 작성하는 데 알파벳 순서를 사용하므로 permission_role 대신 role_permission 을 사용하려고한다고 가정합니다. 다음과 같이 피벗 테이블 이름을 두 번째 매개 변수로 전달해야합니다.

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

노트 2

피봇 테이블에서 다른 키 이름을 사용하면서 다음을 고려하십시오.

Eloquent는 키가 세 번째와 네 번째 매개 변수로 전달되지 않으면 _id 하는 단일 테이블 이름이된다고 가정합니다. 따라서 피벗에는 role_idpermission_id 필드가 있다고 가정합니다. 이것 이외의 키를 사용하는 경우는, 3 번째와 4 번째의 파라미터로서 건네 줄 필요가 있습니다.

경우는 말할 수 other_role_id 대신 role_idother_permission_id 대신 permission_id 사용됩니다. 그래서 그것은 다음과 같이 될 것입니다.

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

다형성

다형성 관계는 모델이 단일 연관에서 하나 이상의 다른 모델에 속하는 것을 허용합니다. 좋은 예가 이미지 일 것이고, 사용자와 제품 모두 이미지를 가질 수 있습니다. 테이블 구조는 다음과 같습니다.

user
    id - integer
    name - string
    email - string

product
    id - integer
    title - string
    SKU - string

image
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

살펴볼 중요한 열은 이미지 테이블에 있습니다. imageable_id 열에는 사용자 또는 제품의 ID 값이 포함되며 imageable_type 열에는 소유 모델의 클래스 이름이 포함됩니다. 모델에서 다음과 같이 관계를 설정합니다.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    /**
     * Get all of the owning imageable models.
     */
    public function imageable()
    {
        return $this->morphTo();
    }
}

class User extends Model
{
    /**
     * Get all of the user's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

class Product extends Model
{
    /**
     * Get all of the product's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

morphTo 대한 호출을 수행하는 메소드의 이름에 액세스하여 다형성 모델에서 다형성 관계의 소유자를 검색 할 수도 있습니다. 여기서는 Image 모델의 이미지 imageable 메소드입니다. 따라서 우리는 동적 속성으로 그 메소드에 접근 할 것입니다.

$image = App\Image::find(1);

$imageable = $image->imageable;

imageable 제품은 사용자 또는 제품을 반환합니다.

다 대다

역할과 권한이 있다고 가정 해 보겠습니다. 각 역할은 많은 권한에 속할 수 있으며 각 권한은 여러 역할에 속할 수 있습니다. 그래서 3 개의 테이블이있을 것입니다. 두 개의 모델과 하나의 피벗 테이블. roles , userspermission_role 테이블

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

참고 : 1

피봇 테이블에 다른 테이블 이름을 사용하는 동안 다음을 고려하십시오.

eloquent가 피벗 키 이름을 작성하는 데 알파벳 순서를 사용하므로 permission_role 대신 role_permission 을 사용하려고한다고 가정합니다. 다음과 같이 피벗 테이블 이름을 두 번째 매개 변수로 전달해야합니다.

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

노트 2

피봇 테이블에서 다른 키 이름을 사용하면서 다음을 고려하십시오.

Eloquent는 키가 세 번째와 네 번째 매개 변수로 전달되지 않으면 _id 하는 단일 테이블 이름이된다고 가정합니다. 따라서 피벗에는 role_idpermission_id 필드가 있다고 가정합니다. 이것 이외의 키를 사용하는 경우는, 3 번째와 4 번째의 파라미터로서 건네 줄 필요가 있습니다.

경우는 말할 수 other_role_id 대신 role_idother_permission_id 대신 permission_id 사용됩니다. 그래서 그것은 다음과 같이 될 것입니다.

롤모델

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

사용 권한 모델

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

withPivot ()을 사용하여 중급 테이블에 액세스

피벗 테이블에 세 번째 열 ' permission_assigned_date '가 있다고 가정합니다. 기본적으로 모델 키만 피벗 개체에 나타납니다. 이제 쿼리 결과에서이 열을 가져 오려면 withPivot () 함수에 이름을 추가해야합니다.

   public function permissions()
        {
           return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
        }

부착 / 분리

또한 Eloquent는 관련 모델 작업을보다 편리하게 해주는 몇 가지 추가 도우미 메서드를 제공합니다. 예를 들어, 사용자가 많은 역할을 가질 수 있고 역할이 많은 권한을 가질 수 있다고 가정 해 봅시다. 모델을 조인하는 중간 테이블에 레코드를 삽입하여 권한에 역할을 첨부하려면 attach 메소드를 사용하십시오.

$role= App\Role::find(1);    
$role->permissions()->attach($permissionId);

관계를 모델에 첨부 할 때 중간 테이블에 삽입 할 추가 데이터의 배열을 전달할 수도 있습니다.

$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);

마찬가지로 역할에 대한 특정 사용 권한을 제거하려면 detach 함수를 사용하십시오.

$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);

연결 동기화

sync 메소드를 사용하여 many-to-many 연관을 구성 할 수도있다. sync 메소드는 ID 배열을 받아 중간 테이블에 배치합니다. 지정된 배열에없는 ID는 중간 테이블에서 제거됩니다. 따라서이 작업이 완료되면 주어진 배열의 ID 만 중간 테이블에 존재하게됩니다.

//will keep permission id's 1,2,3 against Role id 1

$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow