consultas anidadas php laravel eloquent

php - consultas anidadas laravel



¿Cómo crear una consulta de múltiples cláusulas en el lugar utilizando Laravel Eloquent? (17)

Estoy utilizando el generador de consultas Laravel Eloquent y tengo una consulta donde quiero una cláusula WHERE en múltiples condiciones. Funciona, pero no es elegante.

Ejemplo:

$results = User:: where(''this'', ''='', 1) ->where(''that'', ''='', 1) ->where(''this_too'', ''='', 1) ->where(''that_too'', ''='', 1) ->where(''this_as_well'', ''='', 1) ->where(''that_as_well'', ''='', 1) ->where(''this_one_too'', ''='', 1) ->where(''that_one_too'', ''='', 1) ->where(''this_one_as_well'', ''='', 1) ->where(''that_one_as_well'', ''='', 1) ->get();

¿Hay una mejor manera de hacer esto, o debo seguir con este método?


Asegúrese de aplicar cualquier otro filtro a las consultas secundarias, de lo contrario podría recopilar todos los registros.

$query = Activity::whereNotNull(''id''); $count = 0; foreach ($this->Reporter()->get() as $service) { $condition = ($count == 0) ? "where" : "orWhere"; $query->$condition(function ($query) use ($service) { $query->where(''branch_id'', ''='', $service->branch_id) ->where(''activity_type_id'', ''='', $service->activity_type_id) ->whereBetween(''activity_date_time'', [$this->start_date, $this->end_date]); }); $count++; } return $query->get();


El método whereColumn puede pasar una matriz de múltiples condiciones. Estas condiciones se unirán utilizando el operador and .

Ejemplo:

$users = DB::table(''users'') ->whereColumn([ [''first_name'', ''='', ''last_name''], [''updated_at'', ''>'', ''created_at''] ])->get(); $users = User::whereColumn([ [''first_name'', ''='', ''last_name''], [''updated_at'', ''>'', ''created_at''] ])->get();

Para obtener más información, consulte esta sección de la documentación https://laravel.com/docs/5.4/queries#where-clauses


En este caso podrías usar algo como esto:

User::where(''this'', ''='', 1) ->whereNotNull(''created_at'') ->whereNotNull(''updated_at'') ->where(function($query){ return $query ->whereNull(''alias'') ->orWhere(''alias'', ''='', ''admin''); });

Debe proporcionarle una consulta como:

SELECT * FROM `user` WHERE `user`.`this` = 1 AND `user`.`created_at` IS NOT NULL AND `user`.`updated_at` IS NOT NULL AND (`alias` IS NULL OR `alias` = ''admin'')


Los ámbitos de consulta pueden ayudarlo a permitir que su código sea más legible.

http://laravel.com/docs/eloquent#query-scopes

Actualizando esta respuesta con algún ejemplo:

En su modelo, cree métodos de alcance como este:

public function scopeActive($query) { return $query->where(''active'', ''='', 1); } public function scopeThat($query) { return $query->where(''that'', ''='', 1); }

Luego, puedes llamar a estos ámbitos mientras construyes tu consulta:

$users = User::active()->that()->get();


Puede usar array en la cláusula where como se muestra a continuación.

$result=DB::table(''users'')->where(array( ''column1'' => value1, ''column2'' => value2, ''column3'' => value3)) ->get();


Puedes usar elocuente en Laravel 5.3

Todos los resultados

UserModel::where(''id_user'', $id_user) ->where(''estado'', 1) ->get();

Resultados parciales

UserModel::where(''id_user'', $id_user) ->where(''estado'', 1) ->pluck(''id_rol'');


Puedes usar subconsultas en funciones anónimas como esta:

$results = User::where(''this'', ''='', 1) ->where(''that'', ''='', 1) ->where(function($query) { /** @var $query Illuminate/Database/Query/Builder */ return $query->where(''this_too'', ''LIKE'', ''%fake%'') ->orWhere(''that_too'', ''='', 1); }) ->get();


Sin un ejemplo real, es difícil hacer una recomendación. Sin embargo, nunca he necesitado usar tantas cláusulas WHERE en una consulta y puede indicar un problema con la estructura de sus datos.

Puede ser útil para usted aprender acerca de la normalización de datos: http://en.wikipedia.org/wiki/Third_normal_form


utilizar la condición whereIn y pasar la matriz

$array = [1008,1009,1010];

User::whereIn(''users.id'', $array)->get();


Cláusulas múltiples donde

$query=DB::table(''users'') ->whereRaw("users.id BETWEEN 1003 AND 1004") ->whereNotIn(''users.id'', [1005,1006,1007]) ->whereIn(''users.id'', [1008,1009,1010]); $query->where(function($query2) use ($value) { $query2->where(''user_type'', 2) ->orWhere(''value'', $value); }); if ($user == ''admin''){ $query->where(''users.user_name'', $user); }

finalmente obteniendo el resultado

$result = $query->get();


Condiciones de uso de Array:

$users = User::where([ ''column1'' => value1, ''column2'' => value2, ''column3'' => value3 ])->get();

Producirá consulta como bramido:

SELECT * FROM TABLE WHERE column1=value1 and column2=value2 and column3=value3

Condiciones de uso de la función antánima:

$users = User::where(''column1'', ''='', value1) ->where(function($query) use ($variable1,$variable2){ $query->where(''column2'',''='',$variable1) ->orWhere(''column3'',''='',$variable2); }) ->where(function($query2) use ($variable1,$variable2){ $query2->where(''column4'',''='',$variable1) ->where(''column5'',''='',$variable2); })->get();

Producirá consulta como bramido:

SELECT * FROM TABLE WHERE column1=value1 and (column2=value2 or column3=value3) and (column4=value4 and column5=value5)


En Laravel 5.3 se pueden usar más whash granulares pasados ​​como matriz:

$query->where([ [''column_1'', ''='', ''value_1''], [''column_2'', ''<>'', ''value_2''], [COLUMN, OPERATOR, VALUE], ... ])

Personalmente no he encontrado un caso de uso para esto solo en varias llamadas, pero el hecho es que puedes usarlo.

Desde junio de 2014 puedes pasar una matriz a where

Siempre que desee utilizar el operador and uso, puede agruparlos de esta manera:

$matchThese = [''field'' => ''value'', ''another_field'' => ''another_value'', ...]; // if you need another group of wheres as an alternative: $orThose = [''yet_another_field'' => ''yet_another_value'', ...];

Entonces:

$results = User::where($matchThese)->get(); // with another group $results = User::where($matchThese) ->orWhere($orThose) ->get();

Lo anterior dará lugar a dicha consulta:

SELECT * FROM users WHERE (field = value AND another_field = another_value AND ...) OR (yet_another_field = yet_another_value AND ...)


$projects = DB::table(''projects'')->where([[''title'',''like'',''%''.$input.''%''], [''status'',''<>'',''Pending''], [''status'',''<>'',''Not Available'']]) ->orwhere([[''owner'', ''like'', ''%''.$input.''%''], [''status'',''<>'',''Pending''], [''status'',''<>'',''Not Available'']])->get();


$variable = array(''this'' => 1, ''that'' => 1 ''that'' => 1, ''this_too'' => 1, ''that_too'' => 1, ''this_as_well'' => 1, ''that_as_well'' => 1, ''this_one_too'' => 1, ''that_one_too'' => 1, ''this_one_as_well'' => 1, ''that_one_as_well'' => 1); foreach ($variable as $key => $value) { User::where($key, ''='', $value); }


DB::table(''users'') ->where(''name'', ''='', ''John'') ->orWhere(function ($query) { $query->where(''votes'', ''>'', 100) ->where(''title'', ''<>'', ''Admin''); }) ->get();


Model::where(''column_1'',''='',''value_1'')->where(''column_2 '',''='',''value_2'')->get();

O

// If you are looking for equal value then no need to add = Model::where(''column_1'',''value_1'')->where(''column_2'',''value_2'')->get();

O

Model::where([''column_1'' => ''value_1'',''column_2'' => ''value_2''])->get();


public function search() { if (isset($_GET) && !empty($_GET)) { $prepareQuery = ''''; foreach ($_GET as $key => $data) { if ($data) { $prepareQuery.=$key . '' = "'' . $data . ''" OR ''; } } $query = substr($prepareQuery, 0, -3); if ($query) $model = Businesses::whereRaw($query)->get(); else $model = Businesses::get(); return view(''pages.search'', compact(''model'', ''model'')); } }