我正在尝试从Laravel 5.6中的Seeder插入数据,而我遇到了json类型字段的问题。我希望这个字段('stops')是一个数组(例如10个整数不重复)。
表播种器(RoutesTableSeeder.php)是这样的:
<?php
use \Illuminate\Support\Facades\DB;
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use App\Models\Route;
class RoutesTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//factory(Route::class, 20)->create();
$faker = Faker::create();
//$values= array();
/*for($i=0; $i < 10; $i++) {
$values []= $faker->unique()->randomDigit;
}
print_r(json_encode($values));*/
foreach (range(1, 20) as $index)
{
$values = array();
for($i=0; $i < 10; $i++) {
$values []= $faker->unique()->randomDigit;
}
//print_r($values);
DB::table('routes')->insert([
'user_id' => $faker->numberBetween($min = 1, $max = 20),
'name' => $faker->name,
'description' => $faker->name,
'route_photo' => $faker->image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null),
'stops'=> [
//$values,
json_encode($values)
//implode(", ", $values)
],
]);
}
}
}
我尝试了几种插入数据的方法。当我使用json_encode($ values)时,我有以下错误:
Array to string conversion
(SQL: insert into `routes` (`user_id`, `name`, `description`, `route_photo`, `stops`)
values (19, Isaac
Feil, Holly Nolan, /tmp/bc8a3cf5e015d3afa96317485499e0ca.jpg,
[8,6,0,7,3,1,5,2,4,9]))
这种价值[8,6,0,7,3,1,5,2,4,9]是我想要存储在'停止'字段中,例如,但我不知道是什么出错了......
拜托,你能帮我这么好吗?我很绝望....
如果有帮助我发布模型:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Route extends Model
{
protected $fillable = [
'user_id',
'name',
'description',
'route_photo',
'stops'
];
protected $casts = [
'stops' => 'array'
];
}
迁移:
public function up()
{
Schema::create('routes', function (Blueprint $table) {
$table->increments('id');
//FK:users
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
//FK:users
$table->string('name');
$table->string('description')->nullable();
$table->string('route_photo');
$table->json('stops');
$table->timestamps();
});
}
非常感谢!!
答案 0 :(得分:4)
json_encode($values)
返回一个字符串,您可以将其用作stops
列的值。没有必要在其周围放置[]
,这会创建一个数组,并且您无法将数组直接存储到列中。只需省略括号:
'stops' => json_encode($values)
但是,将数组存储在数据库列中通常是一个坏主意,它违反了规范化原则。您应该为每个值使用一个单独的表格。
答案 1 :(得分:2)
不要将stops
投射到数组,首先删除
protected $casts = [
'stops' => 'array'
];
并使用json_encode
制作字符串
'stops'=> json_encode($values),