>  기사  >  백엔드 개발  >  Laravel의 Eloquent 모델 소개

Laravel의 Eloquent 모델 소개

不言
不言원래의
2018-07-04 15:31:252041검색

이 글은 주로 Laravel의 Eloquent 모델 소개를 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

Default 상속

use

IlluminateDatabaseEloquent 수업.

데이터 테이블 이름 및 모델 이름 규칙:

데이터베이스 테이블 이름은 일반적으로 "sn"을 사용합니다. 모양을 "명명법"으로 명명합니다. 뱀 명명법에서는 단어가 소문자여야 하고 단어가 밑줄로 연결되어야 하며 이름이 복수형이어야 합니다.

해당 모델명은 "파스칼 방식"을 사용하여 명명되었습니다. 즉, 단어의 첫 글자를 대문자로 표기합니다.

위 계약에 따르지 않는 경우 해당 데이터 테이블을 지정해야 합니다.

class Flight extends Model
{    /**
     * 与模型关联的数据表
     *
     * @var string     */
    protected $table = 'myflights';
}
기본 키:

기본 데이터 테이블 모델은 id 필드를 기본 키로 사용하며 Incrementing 정수 유형입니다.

class Flight extends Model
{    /**
     * 与模型关联的数据表     */
    protected $table = 'my_flights';    protected $primaryKey='mid';  //自定义主键字段
    
    protected $keyType = 'string';  //自定义主键类型为字串
    
    public $incrementing = false;    //主键非自增型}

시간 구분:

모델에는 기본적으로 두 개의 필드(created_at 및 update_at)가 있습니다. 두 개의 필드 없이 $timestamps를 설정할 수 있습니다.

class Flight extends Model
{    /**
     * 该模型是否被自动维护时间戳     */
    public $timestamps = false;
}

$dateFormat 속성은 시간 구분 형식을 사용자 정의하고 저장할 수 있습니다. 데이터 테이블 형식:

class Flight extends Model
{    /**
     * 模型的日期字段的存储格式     */
    protected $dateFormat = 'U';
}

사용자 정의 시간 구분 필드 이름:

<?phpclass Flight extends Model
{    const CREATED_AT = &#39;creation_date&#39;;    const UPDATED_AT = &#39;last_update&#39;;
}

사용자 정의 데이터베이스 연결:

class Flight extends Model
{    /**
     * 此模型的连接名称。     */
    protected $connection = &#39;connection-name&#39;;
}

모델 쿼리:

use App\Flight;$flights = App\Flight::all();   //查询所有数据
foreach ($flights as $flight) {    echo $flight->name;
}$flights = App\Flight::where(&#39;active&#39;, 1)               
->orderBy(&#39;name&#39;, &#39;desc&#39;)               
->take(10)               
->get();             //有条件地查询数据
All 및 get 메소드는

IlluminateDatabaseEloquentCollection

인스턴스를 반환합니다. 대규모 데이터 배치를 쿼리하는 경우 청크를 사용하여 메모리를 절약할 수 있습니다.

Flight::chunk(200, function ($flights) {    foreach ($flights as $flight) {        //    }
});

또는 커서 방식 커서를 사용하여 메모리 사용량을 대폭 줄일 수 있습니다.

foreach (Flight::where(&#39;foo&#39;, &#39;bar&#39;)->cursor() as $flight) {    //}

단일 데이터 쿼리:

// 通过主键取回一个模型...$flight = App\Flight::find(1);
// 取回符合查询限制的第一个模型 ...
$flight = App\Flight::where(&#39;active&#39;, 1)->first();//如果找不到模型则抛出异常
//Illuminate\Database\Eloquent\ModelNotFoundException
//自动返回 HTTP 404 响应给用户
$model = App\Flight::where(&#39;legs&#39;, &#39;>&#39;, 100)->firstOrFail();
집계 쿼리:

$count = App\Flight::where(&#39;active&#39;, 1)->count();$max = App\Flight::where(&#39;active&#39;, 1)->max(&#39;price&#39;);

데이터 업데이트:

저장 방법: 먼저 검색한 다음 업데이트할 속성을 설정한 다음 저장 방법을 실행해야 합니다. 동시에 update_at도 자동으로 업데이트됩니다.

업데이트 방법: where 조건을 설정하고 업데이트 필드를 키-값 쌍으로 업데이트 방법에 전달합니다. 업데이트는 저장 및 업데이트된 모델 이벤트를 트리거하지 않습니다.

$flight = App\Flight::find(1);
$flight->name = &#39;New Flight Name&#39;;$flight->save(); //查询一次后再更新
App\Flight::where(&#39;active&#39;, 1)          
->where(&#39;destination&#39;, &#39;San Diego&#39;)          
->update([&#39;delayed&#39; => 1]); //设置条件后再批量更新

데이터 삽입:

모델을 사용하여 데이터를 생성하려면 먼저 $fillable 또는 $guarded 속성을 설정해야 합니다. 두 속성 중 하나만 선택할 수 있습니다.

class Flight extends Model
{    /**
     * 可以被批量赋值的属性。
     * @var array     */
    protected $fillable = [&#39;name&#39;];
}class Flight extends Model
{    /**
     * 不可被批量赋值的属性。可定义为空数组,表示所有属性都可以赋值。
     * @var array     */
    protected $guarded = [&#39;price&#39;];
}

데이터 삽입 방법:

$flight = App\Flight::create([&#39;name&#39; => &#39;Flight 10&#39;]); //添加新记录并返回已保存的模型实例
$flight->fill([&#39;name&#39; => &#39;Flight 22&#39;]); //已有实例模型可使用fill方法
// 通过 name 属性检索航班,当结果不存在时创建它...
$flight = App\Flight::firstOrCreate([&#39;name&#39; => &#39;Flight 10&#39;]);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它$flight = App\Flight::firstOrCreate(
    [&#39;name&#39; => &#39;Flight 10&#39;], [&#39;delayed&#39; => 1]
);// 通过 name 属性检索航班,当结果不存在时实例化...
$flight = App\Flight::firstOrNew([&#39;name&#39; => &#39;Flight 10&#39;]);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化$flight = App\Flight::firstOrNew(
    [&#39;name&#39; => &#39;Flight 10&#39;], [&#39;delayed&#39; => 1]
);// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元
// 如果不存在匹配的模型就创建一个
$flight = App\Flight::updateOrCreate(
    [&#39;departure&#39; => &#39;Oakland&#39;, &#39;destination&#39; => &#39;San Diego&#39;],
    [&#39;price&#39; => 99]
);

firstOrCreate: 데이터를 찾을 수 없는 경우 첫 번째 매개변수와 두 번째 매개변수 레코드를 기반으로 레코드를 생성하고 저장된 모델을 반환합니다.

firstOrNew: 데이터를 찾을 수 없는 경우 기반 on 새 모델을 생성하기 위해 첫 번째 매개변수와 두 번째 매개변수가 기록되지만 데이터가 저장되지 않습니다. 데이터를 저장하려면 수동으로 저장해야 합니다.

updateOrCreate: 첫 번째 매개변수의 조건에 따라 두 번째 매개변수 데이터를 업데이트합니다. 데이터가 존재하지 않는 경우 두 개의 매개변수 생성 기록을 병합하여 저장된 모델을 반환합니다.

모델 삭제:

$flight = App\Flight::find(1);$flight->delete();  //通过查询所得的模型实例进行delete方法删除

//通过主键删除一至多条数据:App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);//通过查询条件批量删除,并返回删除条数
$deletedRows = App\Flight::where(&#39;active&#39;, 0)->delete();

일괄 삭제 시 삭제 및 모델 삭제 이벤트가 발생하지 않습니다.

소프트 삭제:

데이터 테이블은 삭제된_at 필드를 설정해야 합니다. 모델의 SoftDeletes 특성을 참조하고 delete_at 필드를 $dates 속성으로 설정하세요.

<?php

namespace App;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model
{    use SoftDeletes;    /**
     * 需要被转换成日期的属性。
     * @var array     */
    protected $dates = [&#39;deleted_at&#39;]; 
}

소프트 삭제 모델을 설정합니다. 삭제 메서드에서 삭제된_at가 현재 날짜와 시간으로 설정됩니다. 일시 삭제된 모델을 쿼리하면 일시 삭제된 모델이 자동으로 제외됩니다.

if ($flight->trashed()) {    //检查该模型实例是否被软删除}$flights = App\Flight::withTrashed()  //能使用查询包含软删除的数据
                ->where(&#39;account_id&#39;, 1)                ->get();$flights = App\Flight::onlyTrashed()  //只查询软删除的数据
                ->where(&#39;airline_id&#39;, 1)                ->get();$flight->restore();  //恢复被软删除的模型App\Flight::withTrashed()   //批量恢复模型,不会触发任何模型事件
        ->where(&#39;airline_id&#39;, 1)        ->restore();

소프트 삭제 모델은 강제 삭제를 사용합니다:

$flight->forceDelete();쿼리 범위:

모델에 쿼리 제약 조건 추가 . 전역 및 로컬의 두 가지 유형이 있습니다.

global--조건부 제약 조건은 각 쿼리에 자동으로 추가됩니다.

local--필요에 따라 로컬 제약 조건이 호출됩니다.

전역 범위:

먼저 범위 인터페이스 클래스를 구현해야 합니다.

<?php

namespace App\Scopes;use Illuminate\Database\Eloquent\Scope;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class AgeScope implements Scope
{    /**
     * 将范围应用于给定的 Eloquent 查询生成器
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void     */
    public function apply(Builder $builder, Model $model)
    {        return $builder->where(&#39;age&#39;, &#39;>&#39;, 200);
    }
}

전역 범위가 쿼리의 select 문에 필드를 추가하려면

addSelect 方法而不是 select,以免替换查询的现有select。전역 범위 적용:

을 사용해야 합니다. 모델 부팅 이 메소드는 addGlobalScope 메소드를 사용합니다.

<?php

namespace App;use App\Scopes\AgeScope;use Illuminate\Database\Eloquent\Model;class User extends Model
{    /**
     * 模型的「启动」方法
     *
     * @return void     */
    protected static function boot()
    {
        parent::boot();        static::addGlobalScope(new AgeScope);
    }
}

클로저를 사용하면 별도의 클래스를 정의할 필요 없이 전역 범위를 정의할 수도 있습니다.

class User extends Model
{    /**
     * 模型的「启动」方法
     *
     * @return void     */
    protected static function boot()
    {
        parent::boot();        
        static::addGlobalScope(&#39;age&#39;, function(Builder $builder) {            
        $builder->where(&#39;age&#39;, &#39;>&#39;, 200);
        });
    }
}

전역 범위 삭제:

User::withoutGlobalScope(AgeScope::class)->get();  //删除指定的作用域

// 删除所有的全局作用域User::withoutGlobalScopes()->get();// 删除一些全局作用域User::withoutGlobalScopes([
    FirstScope::class, SecondScope::class])->get();

로컬 범위:

定义通用的约束在需要时使用。定义方法:在模型内定义scope前缀的方法。

<?php

namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model
{    /**
     * 限制查询只包括受欢迎的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopePopular($query)
    {        return $query->where(&#39;votes&#39;, &#39;>&#39;, 100);
    }    /**
     * 限制查询只包括活跃的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeActive($query)
    {        return $query->where(&#39;active&#39;, 1);
    }
}

使用方法:

$users = App\User::popular()->active()->orderBy(&#39;created_at&#39;)->get();

动态作用域:

class User extends Model
{    /**
     * 限制查询只包括指定类型的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeOfType($query, $type)
    {        return $query->where(&#39;type&#39;, $type);
    }
}//调用作用域时传参$users = App\User::ofType(&#39;admin&#39;)->get();

模型事件:

retrieved --查询触发

creatingcreated--创建触发

updatingupdated--更新触发

savingsaved--创建、更新触发

deletingdeleted--删除触发

restoringrestored--恢复触发

事件指派相应的监控器:

<?php

namespace App;use App\Events\UserSaved;use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable
{    use Notifiable;    /**
     * 模型的事件映射。
     *
     * @var array     */
    protected $dispatchesEvents = [        &#39;saved&#39; => UserSaved::class,   //触发saved事件,调用UserSaved监控器
        &#39;deleted&#39; => UserDeleted::class, //触发deleted事件,调用UserDeleted监控器    ];
}

也可所有监听放在一个观察器类中:

<?php

namespace App\Observers;use App\User;class UserObserver
{    /**
     * 监听用户创建的事件。
     *
     * @param  User  $user
     * @return void     */
    public function created(User $user)
    {        //    }    /**
     * 监听用户删除事件。
     *
     * @param  User  $user
     * @return void     */
    public function deleting(User $user)
    {        //    }
}

注册观察器:

<?php

namespace App\Providers;use App\User;use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider
{    /**
     * 运行所有应用.
     *
     * @return void     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

 Laravel 开发支付宝支付与提现转账的方法

위 내용은 Laravel의 Eloquent 모델 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.