【问题标题】:Laravel: Let user select MODEL and then get queryLaravel:让用户选择模型然后获取查询
【发布时间】:2022-01-07 13:19:41
【问题描述】:

我正在做一个 Laravel 项目,它应该有点模块化。

我写了一个搜索查询,我想要的如下:

型号:
评估A
评估B
评估C

查看:

{{ Form::open(array('route' => 'search')) }}

<select multiple name="search_by_form[]">
 <option selected>Any</option>
 <option value="assessment_a">A</option>
 <option value="assessment_b">B</option>
 <option value="assessment_c">C</option>
               
</select>
{{ Form::close() }}

控制器:
控制器要复杂得多,但我让您更容易理解我的需求。
现在如下所示:

$user_entry =$request->input('search_by_form', []);
$resultArray = [];
foreach ($user_entry as $entry){
  if ($entry == "assessment_a"){
      $model_results = AssessmentA::where("approved",1)->get();
  
  } elseif ($entry == "assessment_b"){
      $model_results = AssessmentB::where("approved",1)->get();
  } elseif($entry == "assessment_c"){
      $model_results = AssessmentC::where("approved",1)->get();
  }
}

我想要什么:

搜索视图控制器: 遍历特定文件夹中的模型

然后:

{{ Form::open(array('route' => 'search')) }}

<select multiple name="search_by_form[]">
  
 <option selected>Any</option> 
 @foreach($models as $model)
 <option value="{{ $model }}">{{ $model->name }}</option>
  @endforeach
</select>
{{ Form::close() }}

除了采用这种丑陋的方法之外,是否可以采用更多类似的方法:

foreach ($user_entry as $entry){

   $entry::where("approved",1)->get(); #Obviously the values on the view would be change to "AssessmentA", etc.

}

这可行吗?

提前致谢!

【问题讨论】:

    标签: php laravel laravel-8


    【解决方案1】:

    我想你会创建任何这样的数组:

    $model_array = ['assessment_a' => AssessmentA::class];
    

    然后在循环中简单地传递值

    foreach ($user_entry as $entry){
    
       $model_array[$entry]::where("approved",1)->get(); #Obviously the values on the view would be change to "AssessmentA", etc.
    
    }
    

    【讨论】:

    • 但这意味着我需要手动将其添加到代码中。因此,如果我要添加一个新的评估:AssessmentD。我需要将它添加到数组中,但我希望它具有“自动化”。但是感谢您的输入!
    • @Piroo 您需要在某些时候定义什么是有效值,否则用户可能会传递无效值,您将尝试访问不存在的类(您必须约束您将从这些模型的数据中接受哪些值)
    • @lagbox 是的,谢谢!我完全忘记了这一点。谢谢
    • @Piroo 如果这个答案有帮助,请将其标记为完成并关闭线程
    【解决方案2】:

    如果您将选择值更改为实际的表名,您可以轻松完成

    {{ Form::open(array('route' => 'search')) }}
    <select multiple name="search_by_form[]">
     <option selected>Any</option>
     <option value="assessments_a">A</option>
     <option value="assessments_b">B</option>
     <option value="assessments_c">C</option>
    </select>
    {{ Form::close() }}
    
    $user_entry = $request->input('search_by_form', []);
    
    if (empty($user_entry)) {
        model_results = collect();
    } else {
        $query = DB::table(array_shift($user_entry))->where('approved', 1);
    
        foreach ($user_entry as $table) {
            $query->union(fn($union) => $union->from($table)->where('approved', 1));
        }
    
        $model_results = $query->get();    
    }
    

    【讨论】:

    • 我会试试的。但我想知道是否有一种 Eloquent 方法可以实现这一目标?
    • 在 sql 视图中对所有分配表进行分组,并添加一个“type”之类的列,其中填充了 assignment_a、b、c 等值。然后为该视图制作模型并查询它AssignmentView::whereIn('type', $user_entry)-&gt;get();
    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 2023-03-14
    • 1970-01-01
    • 2018-09-01
    • 2019-04-04
    • 2021-09-12
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多