为什么管腔在识别色谱柱时会遇到问题?

时间:2019-12-02 08:29:49

标签: php laravel eloquent lumen

我是Lumen的新手,我正在尝试使用雄辩的Model在单个查询中更新多行。 我目前收到此错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'field list' (SQL: update `articles` set `0` = {"title":"my blogMASSUPDATE","description":"myblogdescriptionMASSUPDATE","status":3}, `1` = {"title":"my blogMASSUPDATE","description":"myblogdescriptionMASSUPDATE","status":3}, `2` = {"title":"my blog33MASSUPDATE","description":"myblogdescription33MASSUPDATE","status":3}, `articles`.`updated_at` = 2019-12-02 08:23:28 where `status` = ==)

JSON有效负载如下:

{
    "array1": [{
        "title": "my blogMASSUPDATE",
        "description": "myblogdescriptionMASSUPDATE",
        "status": 3
    }, {
        "title": "my blogMASSUPDATE",
        "description": "myblogdescriptionMASSUPDATE",
        "status": 3
    }, {
        "title": "my blog33MASSUPDATE",
        "description": "myblogdescription33MASSUPDATE",
        "status": 3
    }]
}

控制器内部的代码如下:

public function massUpdate($id, Request $request){
  $this->validate($request, [
    'array1' => 'present|array',
    'array1.*.title' => 'required',
    'array1.*.description' => 'required'
  ]);

  $data = $request->getContent();
  $data = json_decode($data, true);

  Article::where('status', $id)->update($data['array1']);


}

这是路由器代码:

  $router->put('articles/massUpdate/{id}', 'ArticleController@massUpdate');

这是我的RESTClient中用于http请求的URL(请参见restclient.net):

http://localhost:8080/api/articles/massUpdate/3

我不明白问题出在哪里,引用的列存在,并且还有匹配指定值的字段。

编辑: 我尝试了以下解决方案: Laravel 4: how to update multiple fields in an Eloquent model?

建议的代码:

$user = User::where ("username","rok"); // note that this shortcut is available if the comparison is =
$new_user_data = array(...);
$user->fill($new_user_data);
$user->save(); 

现在,当我重构代码以在上下文中使用上面显示的语法时:

  $rows = Article::where('status', $id);

  $rows->fill($data);

我得到了错误:

Call to undefined method Illuminate\Database\Eloquent\Builder::fill()

上面提到的SO答案的注释中已经指出了哪些。 任何人都可以启发我如何处理此问题,因为这段代码看起来确实可以实现我想要的功能:动态大量更新引用的字段。

2 个答案:

答案 0 :(得分:1)

首先查看此Laravel-update

下一步,如果要批量更新,请尝试

->update('column_name'=>$data['array1']);

编辑: 如果您编写了此->

,Builder就不会有类似fill的方法
 $data=
        [
            'title' => 'my blogMASSUPDATE',
            'description' => 'myblogdescriptionMASSUPDATE',
            'status' => 3,
        ];

    $id=1;
    $rows = new Test();
    $rows->fill($data)->save();

您应该在数据库中看到类似这样的内容-> enter image description here

不更新记录,而是创建一个新记录

更新:确定我发现了类似的东西->

         $data=[
        [
            'title' => 'my blogMASSUPDATE',
            'description' => 'myblogdescriptionMASSUPDATE',
            'status' => 3,
        ],
        [
            'title' => 'my blog3MASSUPDATE',
            'description' => 'myblogdescriptionMASSUPDATE',
            'status' => 3,
        ],
        [
            'title' => 'my blog33MASSUPDATE',
            'description' => 'myblogdescription33MASSUPDATE',
            'status' => 3,
        ]
        ];
        $id=3;
    collect($data)->each(function ($item) use($id){
        Test::where('status', $id)->update($item);
    });

答案 1 :(得分:0)

请检查一下,我认为必须有效:

$data = '{
    "array1": [{
        "title": "my blogMASSUPDATE",
        "description": "myblogdescriptionMASSUPDATE",
        "status": 3
    }, {
        "title": "my blogMASSUPDATE",
        "description": "myblogdescriptionMASSUPDATE",
        "status": 3
    }, {
        "title": "my blog33MASSUPDATE",
        "description": "myblogdescription33MASSUPDATE",
        "status": 3
    }]
}';


$data = json_decode($data, true);

foreach ( $data['array1'] as $item ) {
    Article::where('status', $id)->update($item);
}