ホームページ >バックエンド開発 >PHPチュートリアル >LaravelのEloquentモデルの紹介
この記事では、主に Laravel の Eloquent モデルの紹介を紹介します。一定の参考価値があります。今、みんなに共有しています。困っている友達は参考にしてください。
Default use Illuminate\Database\Eloquent\Model クラスを継承します。
#データ テーブル名とモデル名の規則:
データベース テーブル名は、通常、「スネーク命名法」を使用して命名されます。ヘビの命名法では、単語を小文字にし、単語を_アンダースコアで接続し、名前を複数形にする必要があります。
対応するモデル名は、「Pascal メソッド」を使用して命名されます。 、各単語の最初の文字は大文字になります。
#上記の合意に従わない場合は、対応するデータ テーブルを次のようにする必要があります。指定する必要があります: class Flight extends Model
{ /**
* 与模型关联的数据表
*
* @var string */
protected $table = 'myflights';
}
主キー:
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 = 'creation_date'; const UPDATED_AT = 'last_update'; }
カスタマイズされたデータベース接続:
class Flight extends Model { /** * 此模型的连接名称。 */ protected $connection = 'connection-name'; }モデル クエリ:
use App\Flight;$flights = App\Flight::all(); //查询所有数据 foreach ($flights as $flight) { echo $flight->name; }$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); //有条件地查询数据all メソッドと get メソッドは、 Illuminate\Database\Eloquent\Collection インスタンスを返します。
データの大きなバッチをクエリする場合は、チャンクを使用してメモリを節約できます:
Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } });または、カーソル メソッド カーソルを使用してメモリ使用量を大幅に削減できます:
foreach (Flight::where('foo', 'bar')->cursor() as $flight) { //}
Query 単一データ:
// 通过主键取回一个模型...$flight = App\Flight::find(1); // 取回符合查询限制的第一个模型 ... $flight = App\Flight::where('active', 1)->first();//如果找不到模型则抛出异常 //Illuminate\Database\Eloquent\ModelNotFoundException //自动返回 HTTP 404 响应给用户 $model = App\Flight::where('legs', '>', 100)->firstOrFail();集計クエリ:
$count = App\Flight::where('active', 1)->count();$max = App\Flight::where('active', 1)->max('price');
データ更新:
save メソッド: 最初に 1 回取得する必要がありますを指定し、update に設定します。その後、属性の save メソッドを実行すると、同時に updated_at も自動的に更新されます。
Update メソッド: where 条件を設定し、更新フィールドをキーと値のペアとして update メソッドに渡します。更新によって、保存および更新されたモデル イベントはトリガーされません。$flight = App\Flight::find(1); $flight->name = 'New Flight Name';$flight->save(); //查询一次后再更新 App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]); //设置条件后再批量更新
データの挿入:
モデルを使用してデータを作成するには、最初に $fillable 属性または $guarded 属性を設定する必要があります。 2 つの属性のうち 1 つだけを選択できます。
class Flight extends Model { /** * 可以被批量赋值的属性。 * @var array */ protected $fillable = ['name']; }class Flight extends Model { /** * 不可被批量赋值的属性。可定义为空数组,表示所有属性都可以赋值。 * @var array */ protected $guarded = ['price']; }データの挿入方法:
$flight = App\Flight::create(['name' => 'Flight 10']); //添加新记录并返回已保存的模型实例 $flight->fill(['name' => 'Flight 22']); //已有实例模型可使用fill方法
// 通过 name 属性检索航班,当结果不存在时创建它... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它$flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] );// 通过 name 属性检索航班,当结果不存在时实例化... $flight = App\Flight::firstOrNew(['name' => 'Flight 10']);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化$flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] );// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元 // 如果不存在匹配的模型就创建一个 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 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('active', 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 = ['deleted_at']; }論理的な削除モデルが設定され、delete メソッドで delete_at が現在の日付と時刻に設定されます。論理的に削除されたモデルをクエリすると、論理的に削除されたモデルが自動的に除外されます。
if ($flight->trashed()) { //检查该模型实例是否被软删除}$flights = App\Flight::withTrashed() //能使用查询包含软删除的数据 ->where('account_id', 1) ->get();$flights = App\Flight::onlyTrashed() //只查询软删除的数据 ->where('airline_id', 1) ->get();$flight->restore(); //恢复被软删除的模型App\Flight::withTrashed() //批量恢复模型,不会触发任何模型事件 ->where('airline_id', 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('age', '>', 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('age', function(Builder $builder) { $builder->where('age', '>', 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('votes', '>', 100); } /** * 限制查询只包括活跃的用户。 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('active', 1); } }
使用方法:
$users = App\User::popular()->active()->orderBy('created_at')->get();
动态作用域:
class User extends Model { /** * 限制查询只包括指定类型的用户。 * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeOfType($query, $type) { return $query->where('type', $type); } }//调用作用域时传参$users = App\User::ofType('admin')->get();
模型事件:
retrieved
--查询触发
creating
、created--创建触发
updating
、updated--更新触发
saving
、saved--创建、更新触发
deleting
、deleted--删除触发
restoring
、restored--恢复触发
事件指派相应的监控器:
<?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 = [ 'saved' => UserSaved::class, //触发saved事件,调用UserSaved监控器 'deleted' => 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のEloquentモデルの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。