サーチ…
モデルを作る
モデル作成
モデルクラスは、 Illuminate\Database\Eloquent\Model
拡張する必要があります。モデルのデフォルトの場所は/app
ディレクトリです。
Artisanコマンドを使用すると、モデルクラスを簡単に生成できます。
php artisan make:model [ModelName]
これはデフォルトでapp/
新しいPHPファイルを作成します。これは[ModelName].php
という名前で、新しいモデルの定型文をすべて含みます。クラス、名前空間、および基本設定に必要なusingを含みます。
モデルと共に移行ファイルを作成する場合は、次のコマンドを使用します。- -m
は移行ファイルも生成します。
php artisan make:model [ModelName] -m
モデルの作成に加えて、モデルに接続されたデータベース移行が作成されます。データベース移行PHPファイルは、デフォルトでdatabase/migrations/
ます。デフォルトでは、idおよびcreated_at
/ updated_at
カラム以外のものは含まれないため、追加のカラムを提供するためにファイルを編集する必要があります。
プロジェクトルートからphp artisan migrate
を使用して、モデルを動作させるためには、マイグレーションを実行する必要があります(マイグレーションファイルを設定したら)。
また、後でモデルを作成した後にマイグレーションを追加する場合は、次のコマンドを実行してマイグレーションを追加することができます。
php artisan make:migration [migration name]
たとえば、Catsのモデルを作成したいとします。これは2つの選択肢があり、移行の有無にかかわらず作成することができます。既にcatsテーブルを持っていた場合や、現時点でcatsテーブルを作成したくない場合は、移行せずに作成することを選択しました。
この例では、まだテーブルを持っていないので、次のコマンドを実行するので、移行を作成します。
php artisan make:model Cat -m
このコマンドは2つのファイルを作成します:
- Appフォルダ内:
app/Cat.php
- データベースフォルダ:
database/migrations/timestamp_creat_cats_table.php
私たちが関心を持っているファイルは、このファイルのように後者です。私たちは、テーブルをどのように見せたいかを決めることができます。定義済みのマイグレーションの場合は、自動増分ID列とタイムスタンプ列が与えられます。
以下の移行ファイルの抽出例には、上記の定義済みの列だけでなく、猫の名前、年齢、色の追加が含まれます。
public function up()
{
Schema::create('cats', function (Blueprint $table) {
$table->increments('id'); //Predefined ID
$table->string('name'); //Name
$table->integer('age'); //Age
$table->string('colour'); //Colour
$table->timestamps(); //Predefined Timestamps
});
}
つまり、表のモデルと移行を作成するのは比較的簡単です。次に、マイグレーションを実行してデータベースで作成するには、次のコマンドを実行します。
php artisan migrate
未解決の移行がデータベースに移行されます。
モデルファイルの場所
モデルはPSR4のおかげでどこにでも保存できます。
デフォルトでは、モデルはapp
ディレクトリにApp
の名前空間とともに作成されます。より複雑なアプリケーションの場合、通常、アプリケーションアーキテクチャに合った構造でモデルを独自のフォルダに保存することをお勧めします。
たとえば、一連の果物をモデルとして使用するアプリケーションがある場合、 app/Fruits
という名前のフォルダを作成し、このフォルダ内にBanana.php
( StudlyCase命名規則を維持)を作成すると、Bananaクラスを作成できますApp\Fruits
ネームスペースで:
namespace App\Fruits;
use Illuminate\Database\Eloquent\Model;
class Banana extends Model {
// Implementation of "Banana" omitted
}
モデル構成
Eloquentは、「構成上の規則」アプローチに従います。基本Model
クラスを拡張すると、すべてのモデルが以下に示すプロパティを継承します。上書きされない限り、次のデフォルト値が適用されます。
プロパティ | 説明 | デフォルト |
---|---|---|
protected $connection | DB接続名 | デフォルトのDB接続 |
protected $table | テーブル名 | デフォルトでは、クラス名はsnake_case 変換され、複数化されます。例えば、 SpecialPerson なりspecial_people |
protected $primaryKey | テーブルPK | id |
public $incrementing | IDが自動インクリメントされているかどうかを示します。 | true |
public $timestamps | モデルにタイムスタンプを付ける必要があるかどうかを示します。 | true |
const CREATED_AT | 作成タイムスタンプ列の名前 | created_at |
const UPDATED_AT | 変更タイムスタンプ列の名前 | updated_at |
protected $dates | timestamps属性に加えて、DateTimeに変更する必要がある属性 | [] |
protected $dateFormat | 日付属性が永続化される形式 | 現行のSQLダイアレクトのデフォルト。 |
protected $with | モデルによるeagerloadとの関係 | [] |
protected $hidden | モデルのシリアライゼーションで属性が省略されています | [] |
protected $visible | モデルの直列化で許可される属性 | [] |
protected $appends | モデルのシリアライズに追加された属性アクセサ | [] |
protected $fillable | 大量割り当て可能な属性 | [] |
protected $guarded | 質量割り当てからブラックリストに記載されている属性 | [*] (すべての属性) |
protected $touches | 保存時に触れるべき関係 | [] |
protected $perPage | 改ページのために返すモデルの数。 | 15 |
プロパティ | 説明 | デフォルト |
---|---|---|
protected $casts | ネイティブ型にキャストする必要がある属性 | [] |
既存のモデルを更新する
$user = User::find(1);
$user->name = 'abc';
$user->save();
また、後でsave
を使用save
必要のないupdate
を使用して、複数の属性を一度に更新することもできます。
$user = User::find(1);
$user->update(['name' => 'abc', 'location' => 'xyz']);
あらかじめクエリを実行することなくモデルを更新することもできます:
User::where('id', '>', 2)->update(['location' => 'xyz']);
モデルのupdated_at
タイムスタンプの変更をトリガしたくない場合は、 touch
オプションを渡すことができます:
$user = User::find(1);
$user->update(['name' => 'abc', 'location' => 'xyz'], ['touch' => false]);