【決定版】Laravelでテーブルを作成:マイグレーション、Eloquent、MariaDBを統合的に理解

2024-05-23

Laravel で 2 つのタイムスタンプ列を持つテーブルを作成するときのエラーに関する詳細な説明

原因: Laravel はデフォルトで created_atupdated_at という 2 つのタイムスタンプ列をすべてのテーブルに自動的に追加します。マイグレーションで明示的に同じ名前の列を定義すると、エラーが発生します。

解決策:

  1. マイグレーションで定義するタイムスタンプ列の名前を変更する。
  2. timestamps プロパティをマイグレーションクラスで使用して、Laravel が自動的にタイムスタンプ列を追加しないように設定する。

詳細:

タイムスタンプ列名の変更:

マイグレーションで定義するタイムスタンプ列の名前を変更すると、Laravel との競合を回避できます。たとえば、次のように列名を変更できます。

$table->timestamp('created_on')->nullable();
$table->timestamp('updated_on')->nullable();
public function up()
{
    Schema::create('my_table', function (Blueprint $table) {
        // ... その他の列の定義 ...

        $table->timestamps(false); // Laravelが自動的にタイムスタンプ列を追加しないように設定
    });
}

補足:

  • マイグレーションで created_at または updated_at 列を定義する場合、それらの列の型は TIMESTAMP である必要があります。

例:

以下のコードは、created_onupdated_on という名前の 2 つのタイムスタンプ列を持つ my_table テーブルを作成するマイグレーションの例です。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('my_table', function (Blueprint $table) {
            $table->id();
            // ... その他の列の定義 ...
            $table->timestamp('created_on')->nullable();
            $table->timestamp('updated_on')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('my_table');
    }
}

この例では、timestamps プロパティは使用されていません。これは、created_onupdated_on という名前の列を明示的に定義しているためです。




サンプルコード:Laravel で 2 つのタイムスタンプ列を持つテーブルを作成する

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('my_table', function (Blueprint $table) {
            $table->id();
            // ... その他の列の定義 ...
            $table->timestamp('created_on')->nullable();
            $table->timestamp('updated_on')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('my_table');
    }
}

説明:

  • このコードは、Laravel のマイグレーションクラス CreateMyTable を定義しています。
  • up() メソッドは、マイグレーションを実行するために実行されるメソッドです。
  • Schema::create('my_table', function (Blueprint $table) { ... }) は、my_table という名前のテーブルを作成します。
  • $table->id(); は、id という名前のプライマリキー列を作成します。
  • // ... その他の列の定義 ... は、テーブルに追加するその他の列を定義する場所です。
  • $table->timestamp('created_on')->nullable(); は、created_on という名前のタイムスタンプ列を作成します。この列は NULL を許可します。

使用方法:

  1. このコードを database/migrations ディレクトリに保存します。
  2. ターミナルで次のコマンドを実行してマイグレーションを実行します。
php artisan migrate

このコマンドを実行すると、my_table テーブルがデータベースに作成されます。

注意事項:

  • このコードは、Laravel 8 以降で使用することを想定しています。
  • マイグレーションを実行する前に、データベースに接続されていることを確認してください。



Laravel で 2 つのタイムスタンプ列を持つテーブルを作成するその他の方法

$table->timestamps() メソッドを使用すると、Laravel が自動的に created_atupdated_at という名前の 2 つのタイムスタンプ列を作成します。この方法は、簡潔でわかりやすいコードを作成したい場合に役立ちます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('my_table', function (Blueprint $table) {
            $table->id();
            // ... その他の列の定義 ...
            $table->timestamps(); // Laravelが自動的にcreated_atとupdated_at列を追加
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('my_table');
    }
}

withTimestamps() メソッドを使用して、Eloquent モデルにタイムスタンプ列を追加することもできます。この方法は、モデルクラスでタイムスタンプ列を定義したい場合に役立ちます。

<?php

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class MyModel extends Model
{
    use SoftDeletes;

    protected $fillable = [
        // ... その他の属性 ...
    ];

    public function timestamps()
    {
        return [
            'created_at' => 'created_on',
            'updated_at' => 'updated_on',
        ];
    }
}

この例では、MyModel モデルは created_onupdated_on という名前の 2 つのタイムスタンプ列を持ちます。

カスタムのカラム名を使用する

created_atupdated_at 以外の名前のタイムスタンプ列を作成することもできます。これを行うには、マイグレーションまたはモデルクラスで列名を明示的に定義する必要があります。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMyTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('my_table', function (Blueprint $table) {
            $table->id();
            // ... その他の列の定義 ...
            $table->timestamp('creation_time')->nullable();
            $table->timestamp('last_update')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('my_table');
    }
}

Laravel で 2 つのタイムスタンプ列を持つテーブルを作成する方法はいくつかあります。最良の方法は、特定のニーズと要件によって異なります。


php eloquent mariadb


cPanelでWordPressインストール時に発生するエラー「PHPインストールにMySQL拡張機能が欠落」の解決策:サンプルコード付き

PHP インストールには WordPress で必要とされる MySQL 拡張機能が欠落しているようです。原因: このエラーメッセージは、PHP インストールに MySQL 拡張機能がインストールされていないことを示しています。MySQL 拡張機能は、WordPress がデータベースに接続してデータを保存するために必要なものです。...


エスケープやクエリパラメータ:MySQLでバッククォートとシングルクォートを使いこなす

MySQLでは、バッククォート(`)とシングルクォート(')は、データベースとのやり取りにおいて重要な役割を果たします。それぞれの記号は異なる意味を持ち、適切な場面で使用することが重要です。バッククォートテーブル名、カラム名、エイリアスなど、データベースオブジェクトの名前を囲むために使用します。...


【MySQL/MariaDB】クエリ結果を小数点にキャストする方法を徹底解説! CAST(), CONVERT(), FORMAT() 関数を使いこなそう

CAST() 関数は、値を別のデータ型に変換するために使用されます。小数点にキャストするには、次のように CAST() 関数に DECIMAL データ型を指定します。precision は、小数点以下の桁数を含めた合計桁数を指定します。scale は、小数点以下の桁数を指定します。...


MariaDBでLIKE制約をCHECK制約内で使用する

例:次の例では、name列の値が英字のみを含む必要があることを確認するために、CHECK制約内でLIKE制約を使用しています。この例では、name列の値が英字のみを含む場合、INSERTまたはUPDATEステートメントが成功します。それ以外の場合は、エラーが発生します。...


MariaDB の自動切断時間を設定してサーバーリソースを節約する方法

自動切断時間:デフォルトでは、自動切断時間は10時間です。つまり、接続が10分間アイドル状態になると、自動的に切断されます。設定方法:自動切断時間は、いくつかの方法で設定できます。MariaDB 設定ファイル:例:自動切断時間を5時間に設定するには、...