【问题标题】:How to use the query builder updateOrInsert method?如何使用查询生成器 updateOrInsert 方法?
【发布时间】:2020-02-13 06:31:37
【问题描述】:

我正在尝试使用 Eloquent's updateOrInsert 方法来填充 mySQL 表,这是迁移:

Schema::create('myTable', function (Blueprint $table) {
      $table->increments('id');
      $table->time('value1')->nullable();
      $table->time('value2')->nullable();
      $table->time('value3')->nullable();
      $table->time('value4')->nullable();
    });
 }

这是控制器:

   DB::connection('myDB')->table('myTable')
       ->updateOrInsert(
           [
               'id' => $request->id
           ],
           [
               'value1' => $request->value1,
               'value2' => $request->value2,
               'value3' => $request->value3,
               'value4' => $request->value4
           ]);

这是axios.post() 请求:

axios.post("populateMyTable/", {
        id: this.newTableEntry.id,
        value1: this.newTableEntry.value1,
        value2: this.newTableEntry.value2,
        value3: this.newTableEntry.value3,
        value4: this.newTableEntry.value4
    });

现在我基本上要在这里实现的是,如果数据库中没有具有请求 ID 的记录,则创建一个并填充它。如果有,只需更新所述记录的值。 但是,我正在努力做的是:如果有记录,我只想更新传递的值(比如说 value1/value3),不要碰其他的(这就是我制作它们的原因nullable();)。

但是,每次我创建记录时,如果某些值留空,它们会被更新为 null,无论它们是否已经包含来自先前条目的数据,并且假设我之前已经填充了 value1 1,现在再次插入1,它不会变成2(不添加每个请求的值,只是更新它们)。我觉得我在这件事上完全错了,但我对mySQLEloquent 还很陌生,所以如果有人能在这里帮助我,那就太好了!提前致谢!

【问题讨论】:

  • 你没有使用 eloquent,只是查询构建器,顺便说一句

标签: mysql laravel vue.js eloquent


【解决方案1】:

您可以只使用您想要保留的数据创建array

正如@rahul-rathore 所说,使用updateOrCreate 方法而不是updateOrInsert

$data = [];
if ($request->value1) {
    $data['value1'] = $request->value1;
}
if ($request->value2) {
    $data['value2'] = $request->value2;
}

...

DB::connection('myDB')->table('myTable')
    ->updateOrCreate(
        [
            'id' => $request->id
        ],
        $data
    );

【讨论】:

  • 问题是,大概有 15 个字段可以填充,用户现在可以选择填充字段 1 和 5,但下次填充字段 7 和 10。因此,无论用户填充哪个字段,我都必须使其尽可能动态。
  • 如果您为每个字段编写一个条件,它将起作用。
  • 谢谢,我试试看!
  • 请使用 updateOrCreate 而不是 updateOrInsert
【解决方案2】:

感谢大家花时间回答我的问题,这是我得到的解决方案:

foreach ($request->requestData as $requestData) {
            $filteredRequestData = array_filter($requestData, function ($var) {
                return !is_null($var);
            });
            DB::connection('myDB')->table('myTable')
            ->updateOrInsert(
                [
                    'document_id' => $requestData['document_id'],
                    'row_id' => $requestData['row_id'],
                ],
                $filteredRequestData,
             );

foreach 循环请求数据,array_filter 方法过滤数据并返回非空变量,然后将updateOrInsert 输入数据库。希望这对某人有帮助!

【讨论】:

    【解决方案3】:

    请使用以下示例。

    DB::connection('myDB')->table('myTable')
    ->updateOrCreate(
                    [
                        'id' => $request->id
                    ],
                    [
                        'value1' => $request->value1,
                        'value2' => $request->value2,
                        'value3' => $request->value3,
                        'value4' => $request->value4
                    ]
         );
    

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-12-25
      • 2018-09-28
      • 2013-05-30
      相关资源
      最近更新 更多