Функциональность поиска Laravel — ссылка на вторую модель/коллекцию/таблицу

Я пытаюсь реализовать функцию поиска в своем лезвии для моей модели скрипта. Он отлично работает для всего, что связано с поиском непосредственно в коллекции/таблице Script. Однако мои пользователи также должны иметь возможность вводить first_name или last_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'])}}

Скриптконтроллер

$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);

Я не уверен, что это ясно. Вы пытаетесь показать имя и фамилию пациента, которому принадлежат найденные сценарии? Или вы пытаетесь показать найденные скрипты принадлежащие больному?

danboh 11.02.2019 22:54

@danboh Я пытаюсь показать сценарии, принадлежащие найденному пациенту.

Xerakon 11.02.2019 22:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
79
2

Ответы 2

Это высокий уровень, но вы можете повторить сценарий найденного пациента, предполагая, что у вас есть лезвие, где вы будете обрабатывать ответ:

$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

@Leorent посмотрите на комментарий выше: «Я пытаюсь показать сценарии, принадлежащие найденному пациенту»

danboh 11.02.2019 23:09

По сути, вам нужно загрузить модель 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);

Я получаю сообщение об ошибке SQLSTATE[42S22]: Column not found: 1054 Unknown column 'scripts.patients_id' in 'where clause' (SQL: select count(*) as aggregate from scripts`, где существует (выберите * из patients, где scripts.patients_id = patients.id и (first_name как %% или last_name как %%)))` из этого. Когда я пытаюсь изменить «пациентов» на «пациентов», это дает ошибку Call to undefined method App\Script::patient(). столбец в сценариях, который ссылается на пациента, — patient_id.

Xerakon 12.02.2019 03:30

Другие вопросы по теме