9 votes

Conversion de tableau en chaîne de caractères (SQL : insert into

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

Le seeder 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'obtiens 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]))

C'est ce genre de valeur [8,6,0,7,3,1,5,2,4,9] 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, auriez-vous l'amabilité de m'aider ? Je suis désespéré....

Je poste le modèle si cela peut aider :

<?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 !

12voto

Barmar Points 135986

json_encode($values) renvoie une chaîne de caractères, que vous pouvez utiliser comme valeur de l'attribut stops colonne. Il n'est pas nécessaire de mettre [] autour, cela crée un tableau, et vous ne pouvez pas stocker un tableau directement dans une colonne. Il suffit de ne pas mettre de parenthèses :

'stops' => json_encode($values)

Cependant, le stockage des tableaux dans les colonnes de la 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.

5voto

Niklesh Points 1386

Ne pas jeter stops dans le tableau, d'abord enlever

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

Et utiliser json_encode pour faire de la ficelle

'stops'=> json_encode($values),

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X