LaravelのEloquentモデルの紹介

不言
リリース: 2023-04-02 11:16:02
オリジナル
2040 人が閲覧しました

この記事では、主に Laravel の Eloquent モデルの紹介を紹介します。一定の参考価値があります。今、みんなに共有しています。困っている友達は参考にしてください。

Eloquent モデル

Default use Illuminate\Database\Eloquent\Model クラスを継承します。

#データ テーブル名とモデル名の規則:

データベース テーブル名は、通常、「スネーク命名法」を使用して命名されます。ヘビの命名法では、単語を小文字にし、単語を_アンダースコアで接続し、名前を複数形にする必要があります。

対応するモデル名は、「Pascal メソッド」を使用して命名されます。 、各単語の最初の文字は大文字になります。

#上記の合意に従わない場合は、対応するデータ テーブルを次のようにする必要があります。指定する必要があります:

class Flight extends Model
{    /**
     * 与模型关联的数据表
     *
     * @var string     */
    protected $table = 'myflights';
}
ログイン後にコピー
主キー:

モデルのデフォルト データ テーブルは、主キーとして id フィールドを使用します。増加する整数型です。これらはカスタマイズできます:

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

タイムカットオフ:

モデルには、デフォルトで created_at と updated_at の 2 つのフィールドがあります。2 つのフィールドなしで $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 メソッドは、 Illuminate\Database\Eloquent\Collection

インスタンスを返します。

データの大きなバッチをクエリする場合は、チャンクを使用してメモリを節約できます:

Flight::chunk(200, function ($flights) {    foreach ($flights as $flight) {        //    }
});
ログイン後にコピー

または、カーソル メソッド カーソルを使用してメモリ使用量を大幅に削減できます:

foreach (Flight::where(&#39;foo&#39;, &#39;bar&#39;)->cursor() as $flight) {    //}
ログイン後にコピー

Query 単一データ:

// 通过主键取回一个模型...$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;);
ログイン後にコピー

データ更新:

save メソッド: 最初に 1 回取得する必要がありますを指定し、update に設定します。その後、属性の save メソッドを実行すると、同時に updated_at も自動的に更新されます。

Update メソッド: where 条件を設定し、更新フィールドをキーと値のペアとして update メソッドに渡します。更新によって、保存および更新されたモデル イベントはトリガーされません。

$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 属性を設定する必要があります。 2 つの属性のうち 1 つだけを選択できます。

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: データが見つからない場合は、最初のパラメーターと 2 番目のパラメーターのレコードに基づいてレコードを作成し、保存されたモデルを返します。

firstOrNew: データが見つからない場合は、最初と 2 番目のパラメーター レコードに基づいて新しいモデルが作成されますが、データは保存されません。データを保存するには手動で保存する必要があります;

updateOrCreate: 最初のパラメーターに基づいて、条件を使用して 2 番目のパラメーター データを更新します。データが存在しない場合は、2 つのパラメーターをマージしてレコードを作成し、保存されたモデルを返します。

モデルの削除:

$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();
ログイン後にコピー

バッチで削除する場合、削除されたイベントとモデルの削除イベントはトリガーされません。

論理的な削除:

データ テーブルでは、deleted_at フィールドを設定する必要があります。モデル内の SoftDeletes トレイトを参照し、deleted_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;]; 
}
ログイン後にコピー

論理的な削除モデルが設定され、delete メソッドで delete_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();##クエリ スコープ: クエリ制約をモデルに追加します。グローバルとローカルの 2 つのタイプがあります:

グローバル -- 条件付き制約が各クエリに自動的に追加されます;

ローカル -- ローカル制約は必要に応じて呼び出されます。

グローバル スコープ:

まず、スコープ インターフェイス クラスを実装する必要があります。

<?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 ステートメントにフィールドを追加する場合は、次のようにする必要があります。クエリの既存の選択の置き換えを避けるには、

select の代わりに

addSelect

メソッドを使用してください。

グローバル スコープの適用: モデルのブート メソッドで 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート