テーブルに整数の配列を保存したいのですが、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();
});
}
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
]
_