Laravel и Eloquent - применение разных фильтров - PullRequest
3 голосов
/ 01 ноября 2019

Я чувствую себя застрявшим. : (

Я хочу иметь возможность выполнять различные запросы SQL, в зависимости от выбранных фильтров в моей форме:

//My initial query without any filters is this:
$dbQuery="SELECT * FROM \"interactions\" WHERE \"user_id\" = ".Auth::user()->getAttribute('id');
//Then depending on the selected filters the query may be any combination of the following:
if (request('contact_id')) $dbQuery.=" AND \"contact_id\" = ".request('contact_id');
if (request('product_id')) $dbQuery.=" AND \"product_id\" = ".request('product_id');
if (request('type')) $dbQuery.=" AND \"type\" LIKE \"%".request('type')."%\"";
if (request('description')) $dbQuery.=" AND \"description\" LIKE \"%".request('description')."%\"";
if (request('date')) $dbQuery.=" AND \"date\" >= ".request('date');

У меня есть класс с именем "Взаимодействие", который расширяет модель Eloquentи я должен быть в состоянии выполнить вышеупомянутый запрос или представить ту же логику через него.

Любые идеи о том, как я могу достичь этого, будут высоко оценены!

РЕДАКТИРОВАТЬ: СпасибоБрайсу (моему личному герою сегодня) вот что помогло мне:

$query = Interaction::where('user_id', Auth::id());
$contact_id = request('contact_id');
$product_id = request('product_id');
$type = request('type');
$description = request('description');
$date = request('date');
if ($contact_id) $query->where('contact_id', $contact_id);
if ($product_id) $query->where('product_id', $product_id);
if ($type) $query->where('type', 'like', "%".$type."%");
if ($description) $query->where('description', 'like', "%".$description."%");
if ($date) $query->where('date', '>=', $date);
$interactions = $query->get();
return view('interactions.index',compact('interactions'));

Ответы [ 2 ]

4 голосов
/ 01 ноября 2019

Я бы порекомендовал использовать для этого красноречивый конструктор запросов.

Например:

$query = Interaction::where('user_id', Auth::id());

$contact_id = request('contact_id');
$product_id = request('product_id');
$type = request('type');
$description = request('description');
$date = request('date');

if ($contact_id) {
    $query->where('contact_id', $contact_id);
}

if ($product_id) {
    $query->where('product_id', $product_id);
}

if ($type) {
    $query->where('type', 'like', "%$type%");
}

if ($description) {
    $query->where('type', 'like', "%$description%");
}

if ($date) {
    $query->where('date', '>=', \Carbon\Carbon::parse($date));
}

$results = $query->get();

Если у вас много результатов, вы можете использовать разбиение на страницы вместо выборкивсе результаты одновременно, как показано выше.

1 голос
/ 01 ноября 2019

Вы можете использовать ->when() метод документы

$results = Interaction::where('user_id', Auth::id())
    ->when($contact_id, function ($query) use ($contact_id) {
        $query->where('contact_id', $contact_id);
    })
    ->when($product_id, function ($query) use ($product_id) {
        $query->where('product_id', $product_id);
    })
    ->when($type, function ($query) use ($type) {
        $query->where('type', 'like', "%$type%");
    })
    ->when($description, function ($query) use ($description) {
        $query->where('type', 'like', "%$description%");
    })
    ->when($date, function ($query) use ($date) {
        $query->where('date', '>=', \Carbon\Carbon::parse($date));
    })->get();;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...