【问题标题】:Insert array of arrays in Lumen with Eloquent ORM使用 Eloquent ORM 在 Lumen 中插入数组数组
【发布时间】:2020-03-24 22:09:20
【问题描述】:

我发送的 POST 请求如下所示:

{ "array1":
    [
        {"title":"my blogADD","description":"myblogdescriptionADD","status":1},
        {"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
        {"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
    ]
}

它的 JSON 格式,标头已设置。 获取请求的控制器代码如下所示:

    public function create(Request $request){



  $this->validate($request, [
    'array1' => 'present|array',
    'array1.*.title' => 'required',
    'array1.*.description' => 'required'
  ]);

  $data = $request->getContent();

  $data = json_decode($data, true);
  //dd($data);
  Article::insert($data);

}

现在,我已经针对这个问题研究了多个关于 SO 的问题和答案,但发现有些矛盾。 Model::insert() 应该能够在一次调用中插入多行。 但是,如您所见,到目前为止,这对我不起作用。 Model::create() 只能创建一个新行,但我找到了使用循环遍历数组的解决方案。我非常非常想避免这样的解决方案,除非有人可以肯定地告诉我没有其他简单的解决方案。因为我非常相信一定有一个。

当我输入 json_decoded ARRAY 时,我得到的响应是 Array 到 String 的转换阻碍了该过程。 当我输入仅仅是 JSON-String 时,我得到了错误:

"Argument 1 passed to Illuminate\Database\Query\Builder::insert() must be of the type array, string given, called in E:\LumenTut\firstTut\vendor\illuminate\database\Eloquent\Builder.php on line 1350"

嗯,这里有两个指向 SO 帖子的链接,在我看来,它们基本上处理了相同的问题。但不知何故,他们似乎可以解决它而我不能,所以我想知道我错过了什么:

How to insert a multidimensional array in a database using laravel

laravel 5.6 bulk inserting json data

为了完整起见,这里是 ArticleController.php 的完整代码:

编辑:

<?php

namespace App\Http\Controllers;

//use Validator;
use App\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    //

    public function showAllArticles(){
      return response()->json(Article::get(['title', 'description', 'status'])); // ::get([]) spezifiziert die zu referenzierenden Attribute
                                                                                // ::all() referenziert alle Attribute einer Tabelle/Relation
    }

    public function showOneArticle($id){
      return response()->json(Article::find($id));
    }


    public function create(Request $request){



      $this->validate($request, [
        'array1' => 'present|array',
        'array1.*.title' => 'required',
        'array1.*.description' => 'required'
      ]);

      $data = $request->getContent();

      //$data = json_decode($data, true);
      //dd($data);
      Article::insert($data);

    }

    public function update($id, Request $request){

      $this->validate($request, [
        'title' => 'required',
        'description' => 'required'
      ]);

      $article = Article::findOrFail($id);
      $article->update($request->all());
      return response()->json($article, 200);
    }

    public function delete($id, Request $request){

      Article::findOrFail($id)->delete();
      return response('Deleted Successfully', 200);
    }

    public function resetRecords(Request $request){
      Article::where('id', '>', 2)->delete();
    }

}

【问题讨论】:

  • 使用Article::insert($data['array1']);

标签: php laravel eloquent lumen


【解决方案1】:

基于错误。您没有传递数组。您可以使用

更改$data
$data = $request->all();

$request-&gt;all() 从数组中返回帖子中的数据。

您可以使用以下内容重写您的创建方法。

public function create(Request $request){

$request->validate([
    'array1' => 'present|array',
    'array1.*.title' => 'required',
    'array1.*.description' => 'required'
  ]);

  $data = $request->all();

  Article::insert($data['array1']);

}

【讨论】:

    【解决方案2】:

    从外观上看,感觉就像您正在尝试将array1 直接推送到您的表格中,而您需要推送它的内容,所以也许可以在您的控制器代码中尝试这样:

    $requestData = $request->all();//this will give you an array with key array1
    $data = $requestData['array1'];//this will give you data you want to insert  
    Article::insert($data);
    

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2013-12-24
      • 2014-11-15
      • 2019-08-01
      • 2023-03-15
      • 1970-01-01
      • 2012-09-24
      • 2014-04-17
      • 2016-03-16
      相关资源
      最近更新 更多