サーチ…


前書き

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と、次の例に示すように、各キーと値のペアを個別に設定する必要がなく、大量のデータを処理するのがはるかに簡単になります。

使用に注意してくださいonlyexcept要求データを収集するときに。許可/禁止するキーを正確に指定することは重要です。そうしないと、攻撃者がリクエストで追加のフィールドを送信し、意図しない更新を引き起こす可能性があります。

// 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';

    // ...
}

現在、主キー( findfindOrFail )を使用する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のロボットを見つけてクローンします。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow