Cómo hacer dos cláusulas cuando dentro de un anidado

votos
2

Tengo el siguiente código:

$sectors = Sector::where('company_id', $id)
                 ->where('status', '0')
                 ->with('charges.levels')
                 ->get();

y necesito 3 condiciones

  • Mala situación del sector sea 0
  • Estatuto de los cargos sea 0
  • Estatuto de los niveles sea 0

Así que lo que quiero saber:

  • Cómo utilizar un WHERE que buscar el estado de cargas 0 y el estado de los niveles 0 cuando están en una anidada con: -> con charges.levels ( '')

El código tiene las siguientes relaciones:

  • Un sector tiene muchas cargas y una carga pertenece a un sector
  • Una carga tiene muchos niveles y un nivel pertenece a un cargo

Por lo tanto, quiero llevar a todos los niveles en estado de nivel es 0, el estado de carga es 0 y el estado del sector es 0

Publicado el 19/09/2018 a las 17:11
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Se pueden realizar consultas sobre las relaciones de este tipo cuando se está cargando ansiosos:

$sectors = Sector::where('company_id', $id)
    ->with([
        'charges' => function ($query) {
            $query->where('status', 0);
        },
        'charges.levels' => function ($query) {
            $query->where('status', 0);
        }
    ])
    ->get();

Para obtener más información acerca de limitar la carga ansiosa: https://laravel.com/docs/5.7/eloquent-relationships#constraining-eager-loads

Respondida el 19/09/2018 a las 17:18
fuente por usuario

votos
0
$sectors = Sector::where('company_id', $id)->where('status', 0)
    ->whereHas('charges', function (\Illuminate\Database\Eloquent\Builder $query) {
        $query->where('status', 0)
            ->whereHas('levels', function (\Illuminate\Database\Eloquent\Builder $query) {
                $query->where('status', 0);
            });
    })->get();

https://laravel.com/docs/5.7/eloquent-relationships#querying-relationship-existence

Tenga cuidado con esto, sin embargo. Elocuente no hace declaraciones JOIN (excepto en el caso de belongsToManylas relaciones). with()simplemente ejecuta una consulta que utiliza distintos IN()estados poblados por los anteriores, y whereHas()producirán una subconsulta. Así lo anterior producirá una consulta que van a ver algo en la línea de:

SELECT *
FROM sector
WHERE
    status = 0
    AND EXISTS (
        SELECT *
        FROM charge
        WHERE
            charge.sector_id = sector.id
            AND status = 0
            AND EXISTS (
                SELECT *
                FROM levels
                WHERE
                    levels.charge_id = charge.id
                    AND status = 0
            )
    );

No sé sobre otros motores de base de datos, pero MySQL no es muy bueno en el manejo subconsultas. Si se va a hacer un EXPLAINsobre que, el número de entradas iniciales que se estire para la consulta sólo estaría limitada por sector.status, que puede ser un problema si esa tabla es grande y / o sector.statusno está indexado. Esto es en contraposición decir, una JOINconsulta que podría obtener el máximo beneficio de la combinación de criterios de búsqueda. Con JOINs, criterios adicionales suelen mejorar el rendimiento, pero lo contrario es cierto con EXITSs. Lo que podría tener mejor suerte usando esto: https://laravel.com/docs/5.7/queries#joins .

Respondida el 19/09/2018 a las 17:42
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more