# Laravel eloquent model の規約
Model ファイルの基本定義
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
// テーブル名
protected $table = 'products';
// 主キー
protected $primaryKey = 'product_id';
// 主キーID自動インクリメントするのをやめる デフォルトtrue
public $incrementing = false;
// 主キーIDをstringタイプにする
protected $keyType = 'string';
// タイムスタンプ自動更新やめる
public $timestamps = false;
// 日付カラムの保存用フォーマット
protected $dateFormat = 'U';
// created_at updated_at カラムを別名にする
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'updated_date';
// データベース接続指定
protected $connection = 'sqlite';
// モデルの属性のデフォルト値定義
protected $attributes = [
'delayed' => false,
];
// 代入可能な属性定義
protected $fillable = ['name'];
}
# モデルの取得
基本的な使い方
use App\Models\Product;
// 主キーでモデルを取得
$item = Product::find(10110);
$result1 = Product::all();
$result2 = Product::get();
print_r($result1);
print_r($result2);
// Eloquent でクエリ作成 クエリビルダが提供するすべてのメソッドが利用できる
$products = Product::where('price', '>', 100)
->orderBy('name')
->take(10)
->get();
# ルートで使う
API 設計などで使える
// 結果が見つからない場合404 HTTPレスポンスをクライアントへ自動的に返却
Route::get('/api/products/{id}', function ($id) {
return Product::findOrFail($id);
});
# 集計取得
$count = Order::where('active', 1)->count();
$total = Orders::where('active', 1)->sum('total');
$max = Orders::where('active', 1)->max('price');
# クエリビルダでサブクエリする
use App\Models\Destination;
use App\Models\Flight;
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderByDesc('arrived_at')
->limit(1)
])->get();
# モデル INSERT UPDATE
# save メソッド
save メソッド使うことで、created_at updated_at 自動更新されます
save メソッドを使用して、データベースにすでに存在するモデルを更新することもできます。
モデルを更新するには、モデルを取得して、更新する属性をセットする必要があります。
$item = new Product;
$item->name = $request->name;
$item->save();
# create メソッド
create メソッドを使用する前に、モデルクラスで fillable または guarded プロパティを指定する必要があります。
$item = Product::create([
'name' => 'New item',
]);
Model での fillable 定義
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
// 代入可能な属性定義
protected $fillable = ['name'];
}
# updateOrCreate メソッド
既存のモデルを更新する時に、一致するモデルが存在しない場合は、新しいモデルを作成
ロジック順番は UPDATE INSERT 順
$item = Product::updateOrCreate(
['name' => 'apple', 'departure' => 'japan'],
['price' => 299]
);
# SoftDeletes ソフトデリート
モデルに「deleted_at」属性がセットされ、モデルを「削除」した日時が保存されます。モデルのソフト削除を有効にするには、「Illuminate\Database\Eloquent\SoftDeletes」トレイトをモデルに追加します。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
{
// ソフトデリート使う宣言
use SoftDeletes;
}
マイグレーションスキーマビルダーに追加する時
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('products', function (Blueprint $table) {
$table->softDeletes();
});
# モデル replicate
replicate メソッドを使用して、既存のモデルインスタンスの未保存のコピーを作成できます。
use App\Models\Address;
$shipping = Address::create([
'type' => 'shipping',
'city' => 'Victorville',
'postcode' => '90001',
]);
$billing = $shipping->replicate()->fill([
'type' => 'billing'
]);
$billing->save();