web-dev-qa-db-ja.com

配列から文字列への変換(SQL:挿入先

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行を含む個別のテーブルを使用する必要があります。

6
Barmar

stopsを配列にキャストしないでください。最初に削除してください

protected $casts = [
    'stops' => 'array'
];

そしてjson_encode文字列を作成する

'stops'=> json_encode($values),
2
Rishi Raut