Laravel 5.7: как отфильтровать поиск? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь сделать расширенный поиск по нескольким входам:

$orders = new Order;

        if ($request->has('client_id')) {
            $orders->where('client_id' ,$request->client_id);
        }

        if ($request->has('city_id')) {
            $orders->where('city_id', $request->city_id);
        }

        dd($orders->get());

но этот код возвращает все записи базы данных. И если я использую метод get с запросом в одной строке, он работает просто отлично!

$orders->where('city_id', $request->city_id)->get();
dd($orders);

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

простой способ, просто сделай это

$query = Order::query();

if ($request->has('client_id')) {
    $query->where('client_id' ,$request->client_id);
}

if ($request->has('city_id')) {
    $query->where('city_id', $request->city_id);
}

dd($query->get());
0 голосов
/ 07 сентября 2018

попытаться инициализировать запрос

$query = Order::select("*");

if ($request->has('client_id')) {
   $query->where('client_id' ,$request->client_id);
}

if ($request->has('city_id')) {
   $query->where('city_id', $request->city_id);
}

dd($query->get());
0 голосов
/ 07 сентября 2018

Вы должны устанавливать переменную $order каждый раз, когда добавляете предложение, например:

$orders = new Order;

if ($request->has('client_id')) {
     $orders = $orders->where('client_id' ,$request->client_id);
}

if ($request->has('city_id')) {
    $orders = $orders->where('city_id', $request->city_id);
}
 // then run $orders->get(); or other stuff

Новые значения $orders были бы соответственно обновлены.

Довольно интересно, что, как вы заявили, модель вызвала проблему. При создании нового экземпляра Order с использованием ключевого слова new модель не распознает построитель запросов по умолчанию (по какой-то причине), что означает, что dump() в модели нет массива, в который можно вставить новый адрес.

Другие способы, которыми вы могли бы это сделать, - это иметь начальный запрос, например,

Order::whereNotNull('id');

//Otherwise as suggested use `->query()` or `newQuery()`

Имейте в виду, query() подобен псевдониму newQuery() за исключением того, что query() создает свежий экземпляр модели перед вызовом newQuery().

Вместо этого вы можете использовать getQuery(), чтобы получить свойство $query модели вместо двух, поскольку вам не нужно повторно создавать экземпляр построителя. Следовательно, вы можете иметь:

 $orders = Order::getQuery();

if ($request->has('client_id')) {
     $orders->where('client_id' ,$request->client_id);
}

if ($request->has('city_id')) {
    $orders->where('city_id', $request->city_id);
}
 // then run $orders->get(); or other stuff

PS: я проверял это на L5.4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...