A Laravel(DB関連 Eloquent) - user000422/0 GitHub Wiki

思想

トランザクションを忘れるな。 スコープを積極的に使うこと。複雑なクエリをModelに隠蔽できる。 レコードの更新は「save」ではなく「create(update)」を使用する。簡潔だから。

マイグレーション

データベースのバージョン管理機能。 テーブル名は複数形であること。(Laravel公式) カラム名はスネークケースかつ基本は単数形であること。(Laravel公式) マイグレーションスクリプトファイルの場所 database/migrations。 手順 : スクリプトファイル作成 -> スクリプトファイル編集 -> マイグレーション

# artisan マイグレーションスクリプトファイルの作成(テーブル単位)
# ファイル名規則 : create_{作成したいテーブル名}_table
php artisan make:migration create_samples_table

# マイグレーション + MySQL に必要なパッケージのインストール
dnf install php-pdo
dnf install php-mysql

# artisan マイグレーション実行
php artisan migrate

# artisan make:model モデルを作成
php artisan make:model SampleTable
// マイグレーションスクリプトファイル database/migrations/~

// up : テーブル作成
public function up(): void
{
    Schema::create('samples', function (Blueprint $table) {
        // Nullはデフォルトで許容しない
        $table->increments('id'); // 自動採番
        $table->bigIncrements('id');
        $table->integer('age');
        $table->string('password');
        $table->timestamps(); // カラムが2つ作成「created_at」「updated_at」
    }
}

// down : テーブル削除
public function down(): void
{
        // dropColumn('カラム名')だけでよい
        $table->dropColumn('age');
}

Eloquent エロクワント

ORM(Object-Relational Mapping)である。 アクティブレコードによるデーター操作の実装です。 他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。 モデルクラスの命名規則(Laravel公式) : テーブル名は複数形。モデルクラス名は単数系。

■モデルクラス

class Sample extends Model
{
    use HasFactory;

    // fillable : 指定カラムの更新(挿入)を許可
    protected $fillable = ['name', 'age'];

    // guarded : 指定カラムの更新(挿入)を禁止 自動採番のPrimaryKey等を記述しておく
    protected $guarded = ['id'];

    // テーブル名の設定
    protected $table = 'sample';
}

■Controller(DB操作の例)

use use App\Models\Sample;

public function index()
{
    // find : レコードを取得 条件指定(PrimaryKey)
    $result = Sample::find(10);

    // where : レコードを取得 条件指定(自由)
    $result = Sample::where('name', 'Sato')->get();

    // count : 集計 レコード数を取得
    $result = Sample::where('color', 'red')->count();

    // create : レコードを追加
    // Modelに定義( protected $fillable = ['name']; )が必須
    $result = Sample::create([
        // カラム => 値
        'name' => 'Sato Taro',
        'password' => Hash::make($request->password),
    ]);
}

ローカルスコープ

複雑なSQLを簡易な記述で呼び出す。あらかじめModelに定義する。 Modelに定義しControllerから呼び出す。 関数名規則は「scope」+「用途名(頭文字は大文字)」。

// Model Class

// ローカルスコープ( 命名: scope + 用途名を大文字始まり) 
public function scopeActive($query)
{
    // Laravel9以降は「return」を省略推奨
    $query->where('delete_flg', '0');
}
// Controller

public function index($query)
{
    // ローカルスコープを呼び出す テーブル名::スコープ名
    $result = Sample::active()->get();
}

has One

1対1。主テーブルに紐づく従テーブルのレコードを取得。 「LEFT JOIN」のようなイメージ。

// Model 主テーブル

public function sub()
{
    // 引数: 従テーブルのモデル
    return $this->hasOne(Sub::class);
}
// Controller

public function index()
{
    // 主テーブル::条件->主テーブルモデルで定義したhasOne用メソッド
    $result = Main::find(1)->sub;
}