# 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();
2021-10-20
  • php
  • laravel

同じタグを持つ記事をピックアップしました。