Как использовать оператор LIKE с оператором AND в запросе с Laravel - PullRequest
0 голосов
/ 30 октября 2019

Я новичок в Laravel. В представлении у меня есть форма с выпадающим меню, в котором много участников. Когда форма отправлена, значение участника (например, «7») отправляется в контроллер, в котором есть запрос, который должен извлечь из БД все строки, которые имеют «7» в столбце «id_participants». К сожалению, в столбце «id_participants» есть строки в этом формате «3; 8; 65; 4; 34».

Я пытался решить эту проблему разными способами, но мне удалось получить только те строки, у которых запись равна «7».

public function fetch_table(Request $request)
{
    $this->validate($request, [
        'participants' => 'required',
        'start_date' => 'required|date',
        'end_date' => 'required|date',
        'rooms' => 'required',
    ]);

    $start_date = $request['start_date'];
    $end_date = $request['end_date'];
    $participants = $request['participants'];
    $room = $request['rooms'];

    $rooms = Room::all();
    $users = User::all()->where('is_active', '1')->sortBy('surname'); 
    $meetings = Meeting::all()
    ->where('is_active', '1')
    ->where('id_room', $room)
    ->where('date', '<', $end_date)
    ->where('date', '>', $start_date)
    ->where('id_participants', $participants); //look at here

    return view('reportArea', compact('users','rooms','meetings'));
}

Итак, наконец-то я смогусделать аналогичный запрос: SELECT * FROM meetings WHERE id_participants like "%;7" or id_participants like "7;%" or id_participants like "%;7;%" or id_participants = 7. Очевидно, 7 только пример ... запрос должен быть динамическим. Кто-нибудь может мне помочь?

ОБНОВЛЕНИЕ:

Я решил эту проблему после многих попыток замены запроса "встречи" следующим:

$meetings = DB::table('meetings')
            ->where('is_active', '1')
            ->where('id_room', $room)
            ->where('date', '>', $start_date)
            ->where('date', '<', $end_date)
            ->where(function ($query) use($participants) {
              $query->where('id_participants', $participants)
                    ->orWhere('id_participants', 'like', '%;'.$participants)
                    ->orWhere('id_participants', 'like', $participants.';%')
                    ->orWhere('id_participants', 'like', '%;'.$participants.';%');
            })
            ->get();

1 Ответ

1 голос
/ 30 октября 2019

Вы можете вкладывать свои запросы : (связанный ответ )

$meetings = Meeting::all()
    ->where('is_active', '1')
    ->where('id_room', $room)
    ->where('date', '<', $end_date)
    ->where('date', '>', $start_date)
    ->where(function($query){
        $query->where('id_participants', $participants);
        $query->orWhere('id_participants', 'like', '%;'.$participants);
        $query->orWhere('id_participants', 'like', $participants.';%');
        $query->orWhere('id_participants', 'like', '%;'.$participants.';%');
    });

Однако - как отмечают комментарии - сохранение отношенийкак это очень неэффективно. Я предлагаю вам создать отдельную таблицу «многие ко многим» для участников. (кажется, вот как они будут связаны)

https://laravel.com/docs/6.x/eloquent-relationships#many-to-many

...