수색…


소개

Eloquent는 Laravel에 포함 된 ORM (Object Relational Model)입니다. 활성 레코드 패턴을 구현하며 관계형 데이터베이스와 상호 작용하는 데 사용됩니다.

비고

표 이름 지정

규약에서는 테이블 이름에 복수형 "snake_case"를 사용하고 모델 이름에 단 하나의 "StudlyCase"를 사용합니다. 예 :

  • cats 테이블에는 Cat 모델이 있습니다.
  • jungle_cats 테이블에는 JungleCat 모델이 있습니다.
  • users 테이블에는 User 모델이 있습니다.
  • people 테이블에는 Person 모델이 있습니다.

Eloquent는 위에서 언급 한 것처럼 모델 이름의 복수형이있는 테이블로 자동으로 모델을 바인딩하려고 시도합니다.

그러나 기본 규칙을 무시하려면 테이블 이름을 지정할 수 있습니다.

class User extends Model
{ 
    protected $table = 'customers';
}

소개

Eloquent는 Laravel 프레임 워크에 내장 된 ORM 입니다. ActiveRecord 패턴을 사용하여 객체 지향 방식으로 데이터베이스 테이블과 상호 작용할 수 있습니다.

하나의 모델 클래스는 일반적으로 하나의 데이터베이스 테이블에 매핑하고, 다른 유형의도의 관계 ( 일대일는 , 일대 다 , 다 대다 , 다형성)는 다른 모델 클래스 사이에 정의 할 수 있습니다.

Model Making Section은 모델 클래스의 생성과 정의를 설명합니다.

Eloquent 모델을 사용하기 전에 config/database.php 구성 파일에 하나 이상의 데이터베이스 연결이 구성되어 있는지 확인하십시오.

개발 중 웅변 쿼리 빌더 사용법을 이해하려면 php artisan ide-helper:generate 명령을 사용할 수 있습니다. 여기에 링크가 있습니다.


하위 주제 탐색

우연한 관계

지속성

Eloquent로 데이터를 읽는 것 외에도 save() 메소드를 사용하여 데이터를 삽입하거나 업데이트 할 수 있습니다. 새 모델 인스턴스를 만든 경우 레코드가 삽입됩니다 . 그렇지 않으면 데이터베이스에서 모델을 검색하고 새 값을 설정하면 모델이 업데이트됩니다 .

이 예에서는 새로운 User 레코드를 만듭니다.

$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();

또한 create 메소드를 사용하여 데이터 배열을 사용하여 필드를 채울 수 있습니다.

User::create([
    'first_name'=> 'John',
    'last_name' => 'Doe',
    'email'     => '[email protected]', 
    'password'  => bcrypt('changeme'),
]);

create 메소드를 사용할 때 속성은 모델 내의 fillable 배열로 선언되어야합니다.

class User extends Model
{
    protected $fillable = [
         'first_name',
         'last_name',
         'email',
         'password',
    ];
}

또는 모든 속성을 대량 지정할 수 있도록하려면 $ guarded 속성을 빈 배열로 정의 할 수 있습니다.

class User extends Model
{
    /**
    * The attributes that aren't mass assignable.
    *
    * @var array
    */
    protected $guarded = [];
}

그러나 메서드를 create 대신 forceCreate 메서드를 사용하여 모델의 forceCreate fillable 특성을 변경하지 않고 레코드를 만들 수도 있습니다

User::forceCreate([
    'first_name'=> 'John',
    'last_name' => 'Doe',
    'email'     => '[email protected]', 
    'password'  => bcrypt('changeme'),
]);

다음은 기존 User 모델을 먼저로드하여 ( find 를 사용하여) 수정하고 수정 한 다음 저장하는 예제입니다.

$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();

단일 함수 호출로 동일한 위업을 수행하려면 update 메소드를 사용할 수 있습니다.

$user->update([
    'password' => bcrypt('my_new_password'),
]);

createupdate 메서드를 사용하면 다음 예제와 같이 각 키 / 값 쌍을 개별적으로 설정하는 것보다 훨씬 간단하게 많은 수의 데이터 집합을 처리 할 수 ​​있습니다.

요청 데이터를 수집 할 only 사용 except 유의하십시오. 허용 / 거부 할 정확한 키를 지정해야합니다. 그렇지 않으면 공격자가 요청에 따라 추가 필드를 보내 의도하지 않은 업데이트가 발생할 수 있습니다.

// Updating a user from specific request data
$data = Request::only(['first_name', 'email']);
$user->find(1);
$user->update($data);

// Create a user from specific request data
$data = Request::except(['_token', 'profile_picture', 'profile_name']);
$user->create($data);

삭제 중

데이터를 데이터베이스에 기록한 후 삭제할 수 있습니다. 모델 인스턴스를 검색 한 경우 모델 인스턴스를 삭제하거나 삭제할 레코드 조건을 지정할 수 있습니다.

모델 인스턴스를 삭제하려면 모델 인스턴스를 검색하고 delete() 메소드를 호출하십시오.

$user = User::find(1);
$user->delete();

또는 destroy() 메서드를 사용하여 삭제할 레코드의 기본 키 (또는 기본 키 배열)를 지정할 수 있습니다.

User::destroy(1);
User::destroy([1, 2, 3]);

쿼리와 삭제를 결합 할 수도 있습니다.

User::where('age', '<', 21)->delete();

조건과 일치하는 모든 사용자가 삭제됩니다.

참고 : Eloquent를 통해 대량 삭제 문을 실행할 때 deleting deleted 모델 이벤트는 삭제 된 모델에 대해 실행되지 않습니다. 이는 delete 문을 실행할 때 실제로 모델이 검색되지 않기 때문입니다.

소프트 삭제

어떤 경우에는 레코드를 영구적으로 삭제하지 않고 감사 또는보고 목적으로 유지하려고합니다. 이를 위해 Eloquent는 소프트 삭제 기능을 제공합니다.

소프트 삭제 기능을 모델에 추가하려면 SoftDeletes 특성을 가져 와서 Eloquent 모델 클래스에 추가해야합니다.

namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
     use SoftDeletes;
}

모델을 삭제할 때 모델의 테이블에있는 deleted_at 타임 스탬프 열에 타임 스탬프를 설정하므로 먼저 테이블에 deleted_at 열을 만들어야합니다. 또는 마이 그 레이션에서 청사진에서 softDeletes() 메소드를 호출하여 deleted_at 타임 스탬프를 추가해야합니다. 예:

Schema::table('users', function ($table) {
    $table->softDeletes();
});

모든 쿼리는 소프트 삭제 기록을 생략합니다. withTrashed() 범위를 사용하여 원하는 경우 강제로 표시 할 수 있습니다.

User::withTrashed()->get();

사용자가 소프트 삭제 (예 : 휴지통 유형의 영역) 한 후 레코드를 복원 할 수있게하려면 restore() 메소드를 사용할 수 있습니다.

$user = User::find(1);
$user->delete();
$user->restore();

레코드를 강제로 삭제하려면 forceDelete() 메서드를 사용합니다.이 메서드는 데이터베이스에서 실제로 레코드를 제거합니다.

$user = User::find(1);
$user->forceDelete();

기본 키 및 타임 스탬프 변경

기본적으로 Eloquent 모델은 기본 키가 'id' 로 명명 될 것으로 기대합니다. 그렇지 않은 경우 $primaryKey 속성을 지정하여 기본 키의 이름을 변경할 수 있습니다.

class Citizen extends Model
{
    protected $primaryKey = 'socialSecurityNo';

    // ...
}

이제 기본 키 (예 : find 또는 findOrFail )를 사용하는 findOrFail 가이 새 이름을 사용합니다.

또한 Eloquent는 기본 키가 자동 증가 정수가 될 것으로 기대합니다. 기본 키가 자동 증가 정수 (예 : GUID)가 아닌 경우 $incrementing 속성을 false 로 업데이트하여 Eloquent에 알려야합니다.

class Citizen extends Model
{
    protected $primaryKey = 'socialSecurityNo';

    public $incrementing = false;

    // ...
}

기본적으로 Eloquent는 created_atupdated_at 열이 테이블에 존재할 것으로 예상합니다. 이 열을 Eloquent에서 자동으로 관리하지 않으려면 모델의 $timestamps 속성을 false로 설정하십시오.

class Citizen extends Model
{
    public $timestamps = false;

    // ...
}

타임 스탬프를 저장하는 데 사용되는 열의 이름을 사용자 정의해야하는 경우 모델에서 CREATED_ATUPDATED_AT 상수를 설정할 수 있습니다.

class Citizen extends Model
{
    const CREATED_AT = 'date_of_creation';
    const UPDATED_AT = 'date_of_last_update';

    // ...
}

엔티티가 발견되지 않으면 404를 던져라.

모달에서 찾을 수없는 레코드를 검색 할 때 자동으로 예외를 throw하려면 다음 중 하나를 사용하십시오.

Vehicle::findOrFail(1);

또는

Vehicle::where('make', 'ford')->firstOrFail();

기본 키가 1 레코드가 없으면 ModelNotFoundException 이 발생합니다. 본질적으로 글쓰기와 같습니다 ( 소스보기 ) :

$vehicle = Vehicle::find($id);

if (!$vehicle) {
    abort(404);
}

모델 복제

행을 복제해야 할 필요가있을 수도 있고, 몇 가지 속성을 변경할 수도 있지만 DRY를 유지하는 효율적인 방법이 필요합니다. Laravel은이 기능을 수행 할 수있는 일종의 '숨겨진'방법을 제공합니다. 완전히 문서화되지는 않았지만 API를 검색하여 찾아야합니다.

$model->replicate() 하면 레코드를 쉽게 복제 할 수있다.

$robot = Robot::find(1);
$cloneRobot = $robot->replicate();
// You can add custom attributes here, for example he may want to evolve with an extra arm!
$cloneRobot->arms += 1;
$cloneRobot->save();

위의 코드는 ID가 1 인 로봇을 찾은 다음 복제합니다.



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