web-dev-qa-db-ja.com

Laravel移行配列タイプ(データベース列に配列を格納)

テーブルに整数の配列を保存したいのですが、Documentationで配列をサポートする型が見つかりません。なにか提案を。

移行:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->integer('shifts');  <<--------- HERE I want to store an array of integers
        $table->integer('status_id');

        $table->timestamps();
    });
}
25
Zakaria Acharki

arrayデータ型はすべてのデータベースシステムに存在するわけではなく、Laravelのスキーマビルダーはデータベースに依存しないため、一般的でないデータ型列を作成するメソッドを提供しません。したがって、2つのオプションがあります。

1。生のSQLステートメントを使用して列を追加します。下のステートメントのように動作するはずです。クエリビルダーまたはEloquentがこれらのタイプの列を正しく処理できるかどうかはわかりませんが:

_DB::statement('ALTER TABLE pickups ADD COLUMN shifts integer[]');
_

2。属性キャスト を使用して、Eloquentの利用可能な回避策を使用します。移行では、次のように列をjsonとして作成します。

_public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->json('shifts');
        $table->integer('status_id');

        $table->timestamps();
    });
}
_

次に、Pickupモデルをセットアップし(まだセットアップしていない場合)、_$casts_プロパティを使用します。

_class Pickup extends Model
{
    protected $casts = [
        'shifts' => 'array'
    ];
}
_

これにより、Eloquentはデータベースからデータを取得するときに、shifts列の値をarrayに変換する必要があることを認識します。これは実際の配列をエミュレートするだけです。データベースレベルでは、列のタイプはTEXTであり、配列はシリアル化されています。ただし、列値のシリアル化を解除すると、Eloquentはコードで使用する実際の整数の配列を返します。以下に使用例を示します。

_// Create a new Pickup entry
$pickup = App\Pickup::create([
    'default' => true,
    'shifts' => '[1, 5, 7]', // you can easily assign an actual integer array here
    'status_id' => 1
]);
_

上記が、後でエントリを取得するときに、idが_1_に等しいエントリを生成すると仮定します。

_$pickup = App\Pickup::find(1);
dump($pickup->shifts);
_

上記のコードのdump()は、整数の実際の配列を出力します:

_array:3 [▼
  0 => 1
  1 => 5
  2 => 7
]
_
47
Bogdan