Laravel API - 当状态字段为空时显示所有地区

Posted

技术标签:

【中文标题】Laravel API - 当状态字段为空时显示所有地区【英文标题】:Laravel API - Display all districts when state field is empty 【发布时间】: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": []

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

【问题讨论】:

【参考方案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 条件

以上是关于Laravel API - 当状态字段为空时显示所有地区的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 8 中为 API 返回验证规则和消息作为 JSON

当 API 返回空数据时显示警告(Vue.js / Axios)

当字段为空时,如何让内容类型中的链接字段显示默认文本

Laravel 要求数据库中是不是为空

Laravel 刀片:如何删除预先填充的表单字段数据(在 db 中另存为空)

仅在SELECT字段不为空时显示“提交”按钮