【问题标题】:Laravel API - Display all districts when state field is emptyLaravel API - 当状态字段为空时显示所有地区
【发布时间】:2021-09-08 12:42:38
【问题描述】:

下面给出的是我的代码,用于显示输入状态的特定区域。但是在这段代码本身中,如果状态字段为空,我想显示数据库中的所有地区。如何修改我的代码以获得这样的输出。所以,我想要的 API 可以在调用 api 时返回所有地区。并且只有在输入状态字段时,它才会显示特定于它的特定地区。帮助我提出你的建议。

public function state_lookup(Request $request)
{
     $validator = Validator::make
    ($request->all(),
        [
            'state'     => 'string',
        ]
    );

    if ($validator->fails()) {
        return response()->json(
            [$validator->errors()],
            422
        );
    }

    if(empty($request->state)){
        $dist=PersonalDetails::get(['district']);
        return response()->json($dist);
    }

    $data = PersonalDetails::where('state',$request->state)->get(['district']);
 // dd($data);
    if(count($data)){

        return response()->json(['message'=>'success','data'=>$data]);
    }
    else{
        return response()->json(['message'=>'Invalid State']);
    }
}

在失败的情况下,我得到如下 json 结果

    {
    "message": "success",
    "data": []
}

它显示“成功”而不是“无效状态”

【问题讨论】:

    标签: laravel postgresql api laravel-8 rest


    【解决方案1】:

    试试这个,

    //In your controller
    $request->validate([
       'state' => 'string'
    ]);
    
    // $request->validate it self return error messages you have to display 
    // for an example (write below code in your blade file)
    @error('state')
      <div class="alert alert-danger">{{ $message }}</div>
    @enderror
    
    // write below code in your controller file
     $details = PersonalDetails::select('district');
    
     $details->where(function($query) use($request) {
           if (isset($request->state) && $request->state != '') {
              $query->where('state', $request->state);
           }
           // do what you want to filter in your query like above
     });
    
     $data = $details->get();
    

    【讨论】:

      【解决方案2】:

      您可以使用when

      $data = PersonalDetails::when(!empty($request->state),function ($query)use($request){
              $query->where('state',$request->state);
          })->get(['district']);
      

         $data = PersonalDetails::where(function ($query)use($request){
              if(isset($request)&&!empty($request)){
                  $query->where('state',$request->state);
              }
             
          })->get(['district']);
      

      为了避免0键响应变化如下

      if(count($data)){
      
         return response()->json(['message'=>'success','data'=>$data]);
      } 
      

      【讨论】:

      • 查看更新问题。为什么我的成功消息中有一个“0”。我不希望它出现。如何消除?
      • 我在无效的情况下也获得了“成功”。为什么会这样?请查看我更新的问题
      • @MG 更新了答案。如果有任何问题,请告诉我
      • 添加count($data)后结果没有变化
      • @MG.再次检查您的代码。它应该可以工作。只有当它至少有一个数据时才会进入 if 条件,否则它会进入 else 条件
      猜你喜欢
      • 2023-04-09
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      相关资源
      最近更新 更多