Estoy tratando de hacer una búsqueda avanzada por múltiples entradas:

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

Pero este código devuelve todos los registros de la base de datos. Y si uso el método get con la consulta en una línea, ¡funciona bien!

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

¿Alguna idea?

1
AMAFsoft 7 sep. 2018 a las 18:01

3 respuestas

La mejor respuesta

De una manera simple, solo haz esto

$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());
3
kenken9999 7 sep. 2018 a las 15:09

Intenta inicializar la consulta

$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());
1
Syed Arif Iqbal 7 sep. 2018 a las 15:11

Debe establecer la variable $order cada vez que agrega la cláusula, por ejemplo:

$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

Los nuevos valores de $orders se habrían actualizado en consecuencia.

Es bastante interesante que declararas que el modelo causó el problema. Al crear una nueva instancia de Order usando la palabra clave new, el modelo no reconoce el generador de consultas predeterminado (por alguna razón), lo que significa que dump() en el modelo no hay una matriz de dónde empujar el nuevo donde en.

Otras formas de hacerlo es tener una consulta inicial, por ejemplo

Order::whereNotNull('id');

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

Tenga en cuenta que query() es como un alias de newQuery() excepto que query() crea una nueva instancia del modelo antes de llamar a newQuery().

En su lugar, puede usar getQuery() para recuperar la propiedad $query del modelo en lugar de los dos, ya que no necesita volver a crear una instancia del generador. Por lo tanto, puedes tener:

 $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

PD: probé esto en L5.4

2
Oluwatobi Samuel Omisakin 7 sep. 2018 a las 15:44