Laravel API-更新或创建

Laravel API-更新或创建,laravel,Laravel,我正在使用updateOrCreate存储动态字段中的数据。更新工作正常,但我在添加新行时出错 public function store(Request $request) { foreach($request->rows as $row) { $db = Book::updateOrCreate(['id' => $row['id']]); $db->author_id = $request->author_id; $db-

我正在使用
updateOrCreate
存储动态字段中的数据。更新工作正常,但我在添加新行时出错

public function store(Request $request) {
    foreach($request->rows as $row) {
      $db = Book::updateOrCreate(['id' => $row['id']]);
      $db->author_id = $request->author_id;
      $db->publisher_id = $request->publisher_id;
      $db->title = $row['title'];
      $db->genre = $row['genre'];
      $db->save();
    }
  }
我尝试过这种方法,但现在它不适用于更新和创建

public function store(Request $request) {
    foreach($request->rows as $row) {
      $db = Book::updateOrCreate(
      ['id' => $row['id'],
      [
        'title' => $row['title'];
      ]
      ]);
    }
  }
错误消息

updateOrCreate(数组$attributes,数组$values=[]))

创建或更新与属性匹配的记录,并用值填充。

所以你的参数不正确。它需要两个数组参数,而不是一个数组。 看看这个:

公共函数存储(请求$Request){
foreach($request->行作为$row){
$db=Book::updateOrCreate(
['id'=>$row['id']],
[
'title'=>$row['title']
]);
}
}
updateOrCreate(数组$attributes,数组$values=[]))

创建或更新与属性匹配的记录,并用值填充。

所以你的参数不正确。它需要两个数组参数,而不是一个数组。 看看这个:

公共函数存储(请求$Request){
foreach($request->行作为$row){
$db=Book::updateOrCreate(
['id'=>$row['id']],
[
'title'=>$row['title']
]);
}
}
更新或创建

您还可能遇到需要更新 现有模型或创建新模型(如果不存在)。拉威尔提供 一个updateOrCreate方法,可以一步完成此操作。像 第一个或创建方法,updateOrCreate将模型持久化,因此没有 需要调用save():

updateOrCreate(数组$attributes,数组$values=[])

它应该是这样的。但请确保您有可填充的模型

选择1

//Option 1
foreach($request->rows as $row) {
    $db = Book::updateOrCreate(
        [
            'id' => $row['id'] ?? null
        ],
        [
            'author_id' => $request->author_id,
            'publisher_id' => $request->publisher_id,
            'title' => $row['title'],
            'genre' => $row['genre']
        ]
    );
}
选项2

// Options 2
foreach($request->rows as $row) {
    $input = [
         'author_id' => $request->author_id,
         'publisher_id' => $request->publisher_id,
         'title' => $row['title'],
         'genre' => $row['genre']
    ];
    if (isset($row['id'])) {
        if($db = Book::find($row['id'])) {
            $db->update($input);
            continue;
        }
    }

    Book::create($input);
}
编辑:


这些错误表明您的路由不接受POST方法。。将其更改为POST方法

例:
Route::post()
而不是
Route::get()

更新或创建

您还可能遇到需要更新 现有模型或创建新模型(如果不存在)。拉威尔提供 一个updateOrCreate方法,可以一步完成此操作。像 第一个或创建方法,updateOrCreate将模型持久化,因此没有 需要调用save():

updateOrCreate(数组$attributes,数组$values=[])

它应该是这样的。但请确保您有可填充的模型

选择1

//Option 1
foreach($request->rows as $row) {
    $db = Book::updateOrCreate(
        [
            'id' => $row['id'] ?? null
        ],
        [
            'author_id' => $request->author_id,
            'publisher_id' => $request->publisher_id,
            'title' => $row['title'],
            'genre' => $row['genre']
        ]
    );
}
选项2

// Options 2
foreach($request->rows as $row) {
    $input = [
         'author_id' => $request->author_id,
         'publisher_id' => $request->publisher_id,
         'title' => $row['title'],
         'genre' => $row['genre']
    ];
    if (isset($row['id'])) {
        if($db = Book::find($row['id'])) {
            $db->update($input);
            continue;
        }
    }

    Book::create($input);
}
编辑:


这些错误表明您的路由不接受POST方法。。将其更改为POST方法

例:
Route::post()
而不是
Route::get()

确保在控制器中使用了模型

use App\ExampleModel;
在模型中编写受保护的可填充字段,如下所示:

protected $fillable = [
        'title','genre', ...
    ];

确保您使用了控制器中的模型

use App\ExampleModel;
在模型中编写受保护的可填充字段,如下所示:

protected $fillable = [
        'title','genre', ...
    ];

这个错误很奇怪。我仍然有500个错误。如果我删除
['id'=>$row['id']]
错误就消失了,创建新行可以正常工作,但是更新也会创建另一个数据。错误很奇怪。我仍然有500个错误。如果我删除
['id'=>$row['id']]
错误消失,创建新行可以正常工作,但更新后也会创建另一个数据。全部选中。非常感谢。都查过了。非常感谢。这个错误很奇怪。添加新闻行时,两个选项仍有500个错误,但更新有效。两个选项现在都有效,非常感谢!你真棒!这个错误很奇怪。添加新闻行时,两个选项仍有500个错误,但更新有效。两个选项现在都有效,非常感谢!你真棒!这些错误表明您的路由不接受POST方法。。将其更改为POST Method您编辑的帖子使其正常工作。非常感谢你!这些错误表明您的路由不接受POST方法。。将其更改为POST Method您编辑的帖子使其正常工作。非常感谢你!