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();
});
}
どうもありがとう!!
json_encode($values)
は、stops
列の値として使用できる文字列を返します。 []
を配置する必要はなく、配列を作成します。配列を列に直接格納することはできません。括弧は省いてください:
'stops' => json_encode($values)
ただし、データベースの列に配列を格納することは、一般的には悪い考えであり、正規化の原則に違反しています。値ごとに1行を含む個別のテーブルを使用する必要があります。
stops
を配列にキャストしないでください。最初に削除してください
protected $casts = [
'stops' => 'array'
];
そしてjson_encode
文字列を作成する
'stops'=> json_encode($values),