Php Laravel 5.2中的嵌套查询

Php Laravel 5.2中的嵌套查询,php,laravel,eloquent,laravel-5.2,Php,Laravel,Eloquent,Laravel 5.2,我有一个搜索框,我想用它来搜索数据库中表的某些列。这是密码 $project = Project::findOrFail($id); $file = \App\File::find($file); $query = $request->input('q'); $materials = $query ?\App\Material::where('file_id', '=', $file->id)

我有一个搜索框,我想用它来搜索数据库中表的某些列。这是密码

$project = Project::findOrFail($id);
    $file = \App\File::find($file);
    $query = $request->input('q');                   
    $materials = $query
        ?\App\Material::where('file_id', '=', $file->id)
                        ->where('material_name', 'LIKE',  "%$query%" )->get()
        :\App\Material::where('file_id', '=', $file->id)->get();


     return view('projects.file',compact('project', 'file', 'materials'));

页面加载时的数据将被过滤,以仅显示此项目中的项目。但搜索完成后,它会搜索整个表。如何使其仅搜索特定项目中的项目,而不搜索表中的全部项目?

您可以通过以下方式嵌套搜索项目:

public function handle($request, Closure $next)
{
    $project = Project::findOrFail($id);

    $file = \App\File::find($file);

    $materials = \App\Material::newQuery();

    // Did it found the file?    
    if ($file) {
        // Search for the file
        $materials->where('file_id', '=', $file->id);
    }

    // AND, does it have a query to search?
    if ($search_item = $request->input('q')) {
        // Search for the query
        $materials->where('material_name', 'LIKE',  "%$search_item%");
    }

    // AND, does it have a project to filter?
    if ($search_item = $request->input('project')) {
        // Filter the project 
        $materials->where('project', 'LIKE',  "%$search_item%");
    }

    // Now go get the results
    $materials = $materials->get();

    // And return to the view
    return view('projects.file',compact('project', 'file', 'materials'));
}

这解决了部分问题。在所有情况下(无论是否从搜索框输入),我都想让它在表中查找$file值,当有输入时,它应该在表中查找$file和“%$search_item%”。这正是解决这个问题的方法。如果它有一个$文件,搜索文件,如果它有输入,搜索输入,如果它有项目,搜索项目!添加了一些注释进行解释。代码中没有其他内容,因此它是全部。