数组到字符串的转换(sql:insert-into)

f0ofjuux  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(503)

我试图在laravel5.6中插入来自seeder的数据,但我遇到了一个json类型的字段问题。我希望这个字段('stops')是一个数组(例如10个不重复的整数)。
表seeder(routeTableSeeder.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\u 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]是我想存储在“stops”字段中的,但我不知道出了什么问题。。。。
拜托,你能帮我个忙吗?我绝望了。。。。
如果有帮助,我会发布模型:

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

谢谢!!

wsxa1bj1

wsxa1bj11#

json_encode($values) 返回一个字符串,可以将其用作 stops 列。没有必要把 [] 这样就创建了一个数组,不能将数组直接存储到列中。只需去掉括号:

'stops' => json_encode($values)

但是,将数组存储在数据库列中通常是个坏主意,它违反了规范化原则。您应该使用一个单独的表,每个值对应一行。

2lpgd968

2lpgd9682#

不要投 stops 要排列,请先删除

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

使用 json_encode 制作字符串

'stops'=> json_encode($values),

相关问题