web-dev-qa-db-fra.com

Conversion de tableau en chaîne (SQL: insérer dans

J'essaie d'insérer des données d'un Seeder dans Laravel 5.6 et j'ai un problème avec le champ de type json. Je veux que ce champ ('stops') soit un tableau (par exemple de dix entiers non répétés).

Le semoir de table (RoutesTableSeeder.php) est quelque chose comme ceci:

<?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)
            ],
        ]);
    }

  }
  }

J'ai essayé plusieurs façons d'insérer des données. Lorsque j'utilise json_encode ($ values), j'ai l'erreur suivante:

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]))

Ce type de valeur [8,6,0,7,3,1,5,2,4,9] est ce que je veux stocker dans le champ "arrêts", par exemple, mais je ne sais pas ce qui ne va pas ....

S'il vous plaît, seriez-vous si gentil de m'aider? Je suis désespéré....

Je poste le modèle si cela aide:

<?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'
  ];
 }

Et la migration:

  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();
    });
 }

Merci beaucoup!!

json_encode($values) renvoie une chaîne que vous pouvez utiliser comme valeur de la colonne stops. Il n'est pas nécessaire de mettre [] autour, qui crée un tableau, et vous ne pouvez pas stocker un tableau directement dans une colonne. Laissez simplement les crochets:

'stops' => json_encode($values)

Cependant, le stockage de tableaux dans des colonnes de base de données est généralement une mauvaise idée, car il viole les principes de normalisation. Vous devez utiliser un tableau séparé avec une ligne pour chaque valeur.

6
Barmar

Ne jetez pas stops dans un tableau, supprimez d'abord

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

Et utilise json_encode pour faire une chaîne

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