Laravel迁移数组类型(数据库列中的存储数组)

Zak*_*rki 26 php arrays types laravel laravel-5.1

我想在我的表中存储一个整数数组,我在文档中找不到任何支持数组的类型,任何建议.

移民:

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

Bog*_*dan 48

array数据类型是不存在于所有的数据库系统,并且由于Laravel的架构构建的数据库无关,它不提供方法来创建非普通数据类型的列.所以你有两个选择:

1.使用原始SQL语句添加列,类似下面我认为应该工作的语句.虽然我不确定查询生成器或Eloquent是否可以正确处理这些类型的列:

DB::statement('ALTER TABLE pickups ADD COLUMN shifts integer[]');
Run Code Online (Sandbox Code Playgroud)

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

然后你可以设置你的Pickup模型(如果你还没有这样做)并使用该$casts属性:

class Pickup extends Model
{
    protected $casts = [
        'shifts' => 'array'
    ];
}
Run Code Online (Sandbox Code Playgroud)

这将让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
]);
Run Code Online (Sandbox Code Playgroud)

假设上面生成的条目id等于1您以后检索条目时的条目:

$pickup = App\Pickup::find(1);
dump($pickup->shifts);
Run Code Online (Sandbox Code Playgroud)

dump()从上方将输出整数的实际数组的代码:

array:3 [?
  0 => 1
  1 => 5
  2 => 7
]
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下查询是否有效以及如何进行?例如,我想要包含班次 5 的所有记录。 (2认同)

Sta*_*nko 7

还有另一种更复杂的方法,但它允许使用模式生成器创建真正的本机数组。

PostgreSQL 的示例。

  1. 注册新int_array类型,该类型将int[]通过扩展现有的数据库模式语法解析为:
\DB::connection()->setSchemaGrammar(new class extends PostgresGrammar {
    protected function typeInt_array(\Illuminate\Support\Fluent $column)
    {
        return 'int[]';
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您只需要一次,可以将此代码放在迁移中,或者AppServiceProvider将其放入整个项目中。

  1. 现在您可以在迁移中使用此类型:
Schema::table('users', function (Blueprint $table) {
    $table->addColumn('int_array', 'group_ids')->nullable();
});
Run Code Online (Sandbox Code Playgroud)