수색…
관계에 대한 질의
또한 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()
관련 모델 삽입
Comment
와 hasMany
관계가있는 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
두 모델을 연결하는 방법 (예 : User
및 Phone
모델)
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_id
및 phone_id
). 그렇지 않은 경우 변경하십시오.
local_key
: 기본적으로 local_key
는이 값을 id
(현재 모델 기본 키)로 가정하고, 그렇지 않은 경우 변경합니다.
데이터베이스가 laravel 표준에 따라 이름을 저장 한 경우 관계 선언에 외래 키와 로컬 키를 제공 할 필요가 없습니다
설명
다 대다
역할과 권한이 있다고 가정 해 보겠습니다. 각 역할은 많은 권한에 속할 수 있으며 각 권한은 여러 역할에 속할 수 있습니다. 그래서 3 개의 테이블이있을 것입니다. 두 개의 모델과 하나의 피벗 테이블. roles
, users
및 permission_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_id
및 permission_id
필드가 있다고 가정합니다. 이것 이외의 키를 사용하는 경우는, 3 번째와 4 번째의 파라미터로서 건네 줄 필요가 있습니다.
경우는 말할 수 other_role_id
대신 role_id
및 other_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
, users
및 permission_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_id
및 permission_id
필드가 있다고 가정합니다. 이것 이외의 키를 사용하는 경우는, 3 번째와 4 번째의 파라미터로서 건네 줄 필요가 있습니다.
경우는 말할 수 other_role_id
대신 role_id
및 other_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]);