在laravel 5控制器内手动将数据插入数据库,而不使用表单

时间:2018-02-02 02:35:52

标签: php laravel sqlite

我需要在(Laravel 5)控制器内手动插入一些数据到sqlite数据库中,而不需要表单。

我尝试过这种方法:

第一

DB::insert('insert into cars values (?, ?, ?)', [1, "Infinity", "MS500"]);

第二

Car::create([
    'brand' => 'Infinity',
    'model' => 'MS500',
]);

第三

$car = new Car();
$car->setAttribute('brand', 'Infinity');
$car->setAttribute('model', 'MS500');
$car->save();

第一方法有效,但我需要插入数千行,时间和性能不太好。

第二第三方法给我这个错误:

Missing argument 2 for Illuminate\Database\Eloquent\Model::setAttribute(), called in /var/www/html/AppLaravel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php on line 525 and defined

我不知道这个错误是什么意思,我已经找到了很多关于它的信息,并且手动将数据填充到数据库中,没有结果。

这是模型类:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Car extends Model
{
    const CREATED_AT = null;
    const UPDATED_AT = null;
    protected $fillable = ['brand', 'model'];
}

这是迁移类:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCarsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cars', function (Blueprint $table) {
            $table->increments('id');
            $table->string('brand');
            $table->text('model');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cars');
    }
}

修改

我也通过批量插入进行了测试:

第四

$arr = [
    [
        'brand' => 'Infinity',
        'model' => 'MS500',
    ],
    [
        'brand' => 'Toyota',
        'model' => 'LK2500',
    ],
];

DB::insert($arr);

...但我收到了这个新错误:

 ErrorException (E_NOTICE) Array to string conversion

3 个答案:

答案 0 :(得分:3)

对于包含数据的大量数组(让我们说10000行):

$arr = [
    [
        'brand' => 'Infinity',
        'model' => 'MS500',
    ],
    [
        'brand' => 'Toyota',
        'model' => 'LK2500',
    ],
    ...
    // 10000 rows
];

我将数据量分成500个块,然后插入到事务中的数据库中。

$div = 500;

for ($i = 0; $i < intdiv(count($arr), $div); $i++) {

    $new_arr = [];

    for ($j = ($i * $div); $j < (($i + 1) * $div); $j++) {
        $new_arr[] = $arr[$j];
    }

    DB::transaction(function () use ($new_arr) {
        DB::table('hotels')->insert($new_arr);
    });
}

我已经用这种方式完成了这项任务,因为SQLite同时限制了插入量。该解决方案的性能和速度非常高。

修改

对于所有收集粉丝:

collect($arr)->chunk(500)->each(function ($chunk) { 
    DB::transaction(function () use ($chunk) {
        DB::table('hotels')->insert($chunk->toArray());
    });
}). 

答案 1 :(得分:0)

你的PHP版本是什么?我认为你编写的代码应该有用。

试试这个

$car = new Car;
$car->brand = 'Infinity';
$car->model = 'MS500';
$car->save();

=============================

编辑: 我搜索了这个,发现有人有类似的问题。简单来说,这是Laravel安装的一个问题。 https://github.com/ollieread/multiauth/issues/29

答案 2 :(得分:0)

$Car= new App\Car;
$options = $Car->options;
$options['brand'] = 'value';
$options['model'] = 'value';
$Car->options = $options;
$Car->save();

必须有效