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.
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),