批量插入时的Laravel Saving事件

时间:2016-04-27 08:27:49

标签: php laravel

使用此命令以块的形式批量插入大型数据库:

Tuple

但是我想要的是在实际的DB::table($table)->insert($chunk); 操作之前,我希望能够为每个表修改insert数组以添加/删除进入数据库的某些属性。为此,我在模型中设置$chunk事件:

saving

但是,事件似乎不适用于public static function boot() { parent::boot(); static::saving(function ($model) { Log::info('saving'); return true; }); } 操作。

任何人都可以告诉我如何实现这一目标?

PS:我不能使用Model::insert(虽然保存事件可以使用它)方法,因为它只允许我一次保存一条记录而我需要批量插入每个块

由于

1 个答案:

答案 0 :(得分:2)

在这种情况下,您必须创建自己的事件/列表器。

这样的事情:

// For increment and decrement no. of units var def = $('#costcenter_data tr').find('td:nth-child(2)').html(); // default value or the "12" in the example var out = def; // Increment button $('.btn.btn-xs.btn-primary.add-unit').click(function(e){ var count = $('#costcenter_data tr').find('td:nth-child(2)'); var value = parseInt(count.data('change_value')); var clicked; if (isNaN(value) && isNaN(prev)) { value = 1; count.data('clicked', "+") } else { value++; } var prev = count.data('clicked'); if (prev != "+") { clicked = "-"; } else { clicked = prev; } $('#costcenter_data tr').find('td:nth-child(2)').html(out+clicked+value); count.data('change_value', value); count.data('clicked', "+"); }); // Decrement button $('.btn.btn-xs.btn-warning.remove-unit').click(function(e){ var count = $('#costcenter_data tr').find('td:nth-child(2)'); var value = parseInt(count.data('change_value')); var clicked; if (isNaN(value) && isNaN(prev)) { value = 1; count.data('clicked', "-") } else if ((value-1) < 0) { value--; value = Math.abs(value); if (value == parseInt(def)) { alert("Delete prompt here"); return false; } } else { value--; clicked = count.data('clicked'); } var prev = count.data('clicked'); if (prev != "-") { clicked = "+"; } else { clicked = prev; } $('#costcenter_data tr').find('td:nth-child(2)').html(out+clicked+value); count.data('change_value', value); });

php artisan make:event SomeEventName

然后你创建你的监听器(你可以根据laravel docs创建一个单独的文件)或者只是把它放在引导模型方法

//App\Events\SomeEventName

class SomeEventName extends Event
{
    use SerializesModels;

    public $chunk;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(&$chunk)
    {
        $this->chunk = &$chunk;
    }
}

然后像这样使用它:

\Event::listen('App\Events\SomeEventName', function($event) {
      $event->chunk = ['hello new world']; // this will replace the old chunk
});