Laravel搜索功能-参考第二个模型/集合/表

时间:2019-02-11 21:44:26

标签: php laravel

我正在尝试在刀片中为我的脚本模型实现搜索功能。对于直接在脚本集合/表中进行搜索相关的所有事情,它的性能都很好。但是,我的用户还需要能够输入患者first_namelast_name并在脚本表中搜索属于要搜索的患者的脚本记录。这些与hasMany / belongsTo关系相关。有人可以协助我弄清楚如何引用父表以显示当前表的结果吗?

模型

Patient hasMany Script
Script belongsTo Patient          (patient_id)

脚本刀片

{{ Form::text('search', $search, ['class' => 'form-control form-control-sm', 'placeholder' => 'Search Scripts...']) }}
{{Form::submit('Search', ['class' => 'btn btn-primary btn-sm'])}}

ScriptController

$search = $request->search;
$patients = Patient::all();
$scripts = Script::
    when($search, function ($query) use ($search) {
        $query->where(function ($query) use ($search) {
            $query
                ->where('prescribe_date', 'LIKE', '%' . $search . '%')
                ->orWhere('status', 'LIKE', '%' . $search . '%')
                ->orWhere('efax_reference', 'LIKE', '%' . $search . '%')
                ->orWhere('efax_confirmation', 'LIKE', '%' . $search . '%');
            });
        })
        ->paginate(25);

2 个答案:

答案 0 :(得分:0)

这是一个高层次的方法,但是您可以遍历找到的患者的脚本,前提是您拥有用于处理响应的刀片:

$patient = Patient::where('first_name', 'LIKE', '%' . $search . '%')->orWhere('last_name', 'LIKE', '%' . $search . '%')->first();

return view('patient')->with(compact('patient'));

然后在刀片中,进行响应:

@foreach ($patient->scripts as $script)
    {{ $script->name }}
@endforeach

或者,如果您要遣返多名患者,则可以:

@foreach ($patients as $patient)
    {{ $patient->name }}
    @foreach ($patient->scripts as $script)
        {{ $script->name }}
    @endforeach
@endforeach

答案 1 :(得分:0)

基本上,您需要像下面这样Patient来加载orWhereHas模型:

$scripts = Script::
    when($search, function ($query) use ($search) {
    $query->where(function ($query) use ($search) {
        $query
            ->where('prescribe_date', 'LIKE', '%' . $search . '%')
            ->orWhere('status', 'LIKE', '%' . $search . '%')
            ->orWhere('efax_reference', 'LIKE', '%' . $search . '%')
            ->orWhere('efax_confirmation', 'LIKE', '%' . $search . '%');
    });
})
    ->orWhereHas('patients', function ($query) use ($search) {
        $query->where('first_name', 'like', '%' . $search . '%')
            ->orWhere('last_name', 'like', '%' . $search . '%');
    })
    ->paginate(25);