使用 Eloquent ORM 在 Lumen 中插入数组
Insert array of arrays in Lumen with Eloquent ORM
我发送的 POST 请求如下所示:
{ "array1":
[
{"title":"my blogADD","description":"myblogdescriptionADD","status":1},
{"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
{"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
]
}
其JSON格式,headers已设置。
获取请求的控制器代码如下所示:
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);
}
现在,我已经研究了关于这个问题的多个问题和答案,结果有些矛盾。
Model::insert()
应能够在一次调用中插入多行。
但是,如您所见,到目前为止,这对我没有用。
Model::create()
只能创建一个新行,但我找到了使用循环遍历数组的解决方案。我非常非常想避免这样的解决方案,除非有人可以 FOR CERTAIN 告诉我没有其他简单的解决方案。因为我非常相信必须有一个。
当我输入 json_decoded ARRAY 时,我得到的响应是数组到字符串的转换阻碍了该过程。
当我只输入 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 帖子的链接,在我看来,它们基本上处理了同样的问题。但不知何故,他们似乎可以解决它而我不能,所以我想知道我错过了什么:
为了完整起见,这里是 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();
}
}
基于错误。您没有传递数组。您可以将 $data
更改为
$data = $request->all();
$request->all()
returns 来自数组 post 的数据。
您可以使用以下内容重写您的创建方法。
public function create(Request $request){
$request->validate([
'array1' => 'present|array',
'array1.*.title' => 'required',
'array1.*.description' => 'required'
]);
$data = $request->all();
Article::insert($data['array1']);
}
从它的外观来看,感觉就像你试图在你的 table 中直接推送 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);
我发送的 POST 请求如下所示:
{ "array1":
[
{"title":"my blogADD","description":"myblogdescriptionADD","status":1},
{"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
{"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
]
}
其JSON格式,headers已设置。 获取请求的控制器代码如下所示:
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);
}
现在,我已经研究了关于这个问题的多个问题和答案,结果有些矛盾。
Model::insert()
应能够在一次调用中插入多行。
但是,如您所见,到目前为止,这对我没有用。
Model::create()
只能创建一个新行,但我找到了使用循环遍历数组的解决方案。我非常非常想避免这样的解决方案,除非有人可以 FOR CERTAIN 告诉我没有其他简单的解决方案。因为我非常相信必须有一个。
当我输入 json_decoded ARRAY 时,我得到的响应是数组到字符串的转换阻碍了该过程。 当我只输入 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 帖子的链接,在我看来,它们基本上处理了同样的问题。但不知何故,他们似乎可以解决它而我不能,所以我想知道我错过了什么:
为了完整起见,这里是 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();
}
}
基于错误。您没有传递数组。您可以将 $data
更改为
$data = $request->all();
$request->all()
returns 来自数组 post 的数据。
您可以使用以下内容重写您的创建方法。
public function create(Request $request){
$request->validate([
'array1' => 'present|array',
'array1.*.title' => 'required',
'array1.*.description' => 'required'
]);
$data = $request->all();
Article::insert($data['array1']);
}
从它的外观来看,感觉就像你试图在你的 table 中直接推送 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);