Tableau de conversion de chaîne de caractères (SQL: insert into
J'essaie d'insérer des données à partir d'un Semoir dans Laravel 5.6 et je vais avoir un problème avec le champ json type. Je veux ce domaine ("arrêt") pour être un tableau (par exemple de dix entiers de ne pas répéter).
La table de semoir (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($valeurs) 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 genre de valeur [8,6,0,7,3,1,5,2,4,9] est ce que je veux stocker dans "arrêts" de champ, par exemple, mais je ne sais pas ce qui ne va pas....
S'il vous plaît, auriez-vous la gentillesse de m'aider? Je suis désespérée....
Je poste le modèle, s'il permet d':
<?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!!
- Délimité par des virgules des listes dans une colonne est un terrible idée
- Vous ne pouvez pas utiliser un tableau en une chaîne de caractères
- Vous pouvez utiliser seralize puis sur récupérer utilisation unseralize pour obtenir un tableau
Vous devez vous connecter pour publier un commentaire.
json_encode($values)
retourne une chaîne de caractères, que vous pouvez utiliser comme valeur de l'stops
colonne. Il n'y a pas besoin de mettre[]
autour d'elle, qui crée un tableau, et vous ne pouvez pas stocker un tableau directement dans une colonne. Il suffit de laisser les crochets:Cependant, stocker des tableaux dans les colonnes de base de données est généralement une mauvaise idée, qu'elle viole les principes de normalisation. Vous devez utiliser un tableau avec une ligne pour chaque valeur.
unique()
dans la documentation: github.com/fzaninotto/Fakerimplode()
au lieu dejson_encode
.JSON
. Qui l'oblige à être en cours de validité, le format JSON.Ne jette pas
stops
au tableau, la Première supprimerEt l'utilisation
json_encode
pour faire de chaînein_array
si retrouvés générer si pas stocker dans un tableau. que d'une logique.