【问题标题】:如何在 laravel 8 中创建具有一对多关系的 API?
【发布时间】:2022-01-22 16:00:25
【问题描述】:

我想为报告存储创建一个 API,并且可以选择添加多个违规者。

我有一个问题,当我添加一个违规者时,在 POSTMAN 中它显示错误“调用成员函数 getClientOriginalName() on null”。

如何解决?或者如何正确地创建一个具有一对多关系的附加数据的 API?

以下,我自己做的代码;

Controller.php

    public function store(ReportRequest $request)
    {
        try {
            
            $report = Report::create([
                'category_id'       => $request->category_id,
                'user_id'           => Auth::user()->id,
                'title'             => $request->title,
                'description'       => $request->description,
                'incident_date'     => $request->incident_date,
                'injured_victims'   => $request->injured_victims,
                'survivors'         => $request->survivors,
                'dead_victims'      => $request->dead_victims,
                'location'          => $request->location,
                'latitude'          => $request->latitude,
                'longitude'         => $request->longitude
            ]);

            $data[] = array(
                    'violator_photo' => $request->file('violator_photo'),
                    'violator_name'    => $request->violator_name,
                    'violator_age'   => $request->violator_age,            
                    'violator_phone' => $request->violator_phone 
                    );
            
            foreach ($data as $key ) {   

                $photo = $key['violator_photo'];
                $fileName = time().'_'.$photo->getClientOriginalName();
                $filePath = $photo->storeAs('images/violators', $fileName, 'public');

                Violator::create([
                    'report_id' => $report->id,
                    'name'      => $key['violator_name'],
                    'photo'     => $filePath,
                    'age'       => $key['violator_age'],
                    'phone'     => $key['violator_phone'],
                ]);       
            }    
            
            return response()->json([
                'status' => '200',
                'message' => 'success',
                'data' => $report,
            ]);
        } catch (\Exception$err) {
            return $this->respondInternalError($err->getMessage());
        }
    }

【问题讨论】:

    标签: php laravel api eloquent laravel-8


    【解决方案1】:

    用这段代码试试

    public function store(ReportRequest $request)
    {
        try {
    
            $report = Report::create([
                'category_id'       => $request->category_id,
                'user_id'           => Auth::user()->id,
                'title'             => $request->title,
                'description'       => $request->description,
                'incident_date'     => $request->incident_date,
                'injured_victims'   => $request->injured_victims,
                'survivors'         => $request->survivors,
                'dead_victims'      => $request->dead_victims,
                'location'          => $request->location,
                'latitude'          => $request->latitude,
                'longitude'         => $request->longitude
            ]);
            if($report){
                if($request->hasFile('violator_photo')) {
                    $violator_photo=$request->file('violator_photo');
                    $fileName = time().'_'.$violator_photo->getClientOriginalName();
                    $filePath = $violator_photo->storeAs('images/violators', $fileName, 'public');
                }
    
                Violator::create([
                    'report_id' => $report->id,
                    'name'      => $request->violator_name,
                    'photo'     => $filePath?:'',
                    'age'       => $request->violator_age,
                    'phone'     => $request->violator_phone,
                ]); 
            }
            
            return response()->json([
                'status' => '200',
                'message' => 'success',
                'data' => $report,
            ]);
        } catch (\Exception$err) {
            return $this->respondInternalError($err->getMessage());
        }
    }
    

    【讨论】:

      【解决方案2】:

      错误getClientOriginalName(),我认为是因为“violator_photo”不是文件,而是字符串/文本

      所以,如果你想通过 json 请求发送文件,简单的方法是将文件转换为 base64

      在控制器上,您可以对其进行解码,并保存文件

      这里是如何解码它的例子,还有一件事你需要检查base64。一些 base64 编码,添加有关文件类型的额外信息, 例如,如果文件是图像 png,则数据如下所示

      data:image/png;base64,iVBORw0KGg..rest of base64
      

      所以如果数据看起来像这样,您需要删除信息并获取 base64 只需您使用此代码即可完成

      $str ="base64 code";
      $converted = substr($str, strpos($str,',')+1);
      $image = base64_decode($base64_str);
      $filename = "the file name.png"; // or you can get the extension name by the information the include on the first of base64
      $path = "images/violators/";
      Storage::disk('your disk')->put($path.$filename, $image, 'public');
      

      【讨论】:

        猜你喜欢
        • 2018-06-12
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多