サーチ…
前書き
Eloquentは、Laravelに含まれるORM(オブジェクトリレーショナルモデル)です。これは、アクティブなレコードパターンを実装し、リレーショナルデータベースと対話するために使用されます。
備考
テーブルの命名
規約では、テーブル名に複数の "snake_case"を、モデル名に単数の "StudlyCase"を使用します。例えば:
-
cats
テーブルにはCat
モデルがあります -
jungle_cats
テーブルにはJungleCat
モデルがあります -
users
テーブルにはUser
モデルがありUser
-
people
テーブルにはPerson
モデルがあります
Eloquentは、上記のように、モデルの複数の名前を持つテーブルでモデルを自動的にバインドしようとします。
ただし、表の名前を指定すると、デフォルトの規則を変更できます。
class User extends Model
{
protected $table = 'customers';
}
前書き
Eloquentは、Laravelフレームワークに組み込まれたORMです。これにより、 ActiveRecordパターンを使用して、オブジェクト指向の方法でデータベーステーブルと対話することができます。
単一のモデルクラスは、通常、単一のデータベーステーブルにマッピングし、また、異なるタイプの関係( 一対一 、 一対多 、 多対多 、多型)は、異なるモデル・クラスとの間に画定することができます。
モデル作成セクションでは、モデルクラスの作成と定義について説明します。
Eloquentモデルを使用する前に、少なくとも1つのデータベース接続がconfig/database.php
設定ファイルに設定されていることを確認してください。
開発中の雄弁なクエリービルダーの使い方を理解するには、 php artisan ide-helper:generate
コマンドを使用します。ここにリンクがあります。
サブトピックナビゲーション
持続する
Eloquentでデータを読み取るだけでなく、 save()
メソッドを使用してデータを挿入または更新することもできます。新しいモデルインスタンスを作成した場合は、レコードが挿入されます。それ以外の場合は、データベースからモデルを取得して新しい値を設定すると、モデルが更新されます。
この例では、新しいUser
レコードを作成し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 = [];
}
しかし、あなたはまたしても変更せずにレコードを作成することができますfillable
使用して、モデル内の属性forceCreate
方法をではなく、 create
方法を
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
以下は、既存のUser
モデルを最初に読み込み( find
を使用しfind
)、変更して保存することによって、既存のUser
モデルを更新する例です。
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
単一の関数呼び出しで同じフィートを達成するには、 update
メソッドを使うことができます:
$user->update([
'password' => bcrypt('my_new_password'),
]);
create
メソッドとupdate
メソッドをcreate
と、次の例に示すように、各キーと値のペアを個別に設定する必要がなく、大量のデータを処理するのがはるかに簡単になります。
使用に注意してください
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
テーブルにdeleted_at
カラムを作成してください。また、移行時には、青写真にsoftDeletes()
メソッドを呼び出して、 deleted_at
タイムスタンプを追加するdeleted_at
ます。例:
Schema::table('users', function ($table) {
$table->softDeletes();
});
どのクエリでもソフト削除されたレコードは削除されます。 withTrashed()
スコープを使用して強制的に表示することができます:
User::withTrashed()->get();
ソフト削除(つまりゴミ箱タイプの領域)した後にユーザーがレコードを復元できるようにするには、 restore()
メソッドを使用します。
$user = User::find(1);
$user->delete();
$user->restore();
強制的にレコードを削除するには、 forceDelete()
にデータベースからレコードを削除するforceDelete()
メソッドを使用します。
$user = User::find(1);
$user->forceDelete();
主キーとタイムスタンプの変更
デフォルトでは、Eloquentモデルは主キーの名前が'id'
ことを想定しています。そうでない場合は、 $primaryKey
プロパティーを指定して、主キーの名前を変更することができます。
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
現在、主キー( find
やfindOrFail
)を使用するEloquentメソッドは、この新しい名前を使用します。
さらに、Eloquentはプライマリキーが自動インクリメント整数であることを期待しています。主キーが自動インクリメント整数(GUIDなど)でない場合は、 $incrementing
プロパティをfalse
更新してEloquentに通知する必要がありfalse
。
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
デフォルトでは、Eloquentはcreated_at
列とupdated_at
列がテーブルに存在すると想定しています。これらの列がEloquentによって自動的に管理されないようにするには、モデルの$timestamps
プロパティーをfalseに設定します。
class Citizen extends Model
{
public $timestamps = false;
// ...
}
タイムスタンプの格納に使用する列の名前をカスタマイズする必要がある場合は、モデルでCREATED_AT
定数とUPDATED_AT
定数を設定できます。
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
エンティティが見つからない場合は404を投げる
モーダルに見つからないレコードを検索するときに例外を自動的にスローするには、
Vehicle::findOrFail(1);
または
Vehicle::where('make', 'ford')->firstOrFail();
主キーが1
レコードが見つからないModelNotFoundException
は、 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のロボットを見つけてクローンします。