array
数据类型并不是所有数据库系统都支持的,因为 Laravel 的 Schema Builder 是数据库无关的,所以它没有提供创建非通用数据类型列的方法。因此你有两个选择:
1. 使用原始 SQL 语句添加该列,类似下面的语句应该可以工作。虽然我不确定 Query Builder 或 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
]
'shifts' => [1, 5, 7]
创建新的接送条目时,我收到了以下错误消息:PHP warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
。 - Zakaria Acharki'shifts' => '[1, 5, 7]'
,谢谢 :) - Zakaria Acharki