Buscar..


Usando el constructor de consultas Yii2

Yii2 proporciona formas eficientes de recuperar datos de la base de datos. Considere un ejemplo de una tabla de empleados simple con campos emp_id, emp_name y emp_salary . Para recuperar los nombres de los empleados y sus salarios, utilizamos la consulta.

select emp_name,emp_salary from employee

Para generar la consulta anterior en Yii2, hay muchos métodos. Uno de los métodos es usar un objeto yii \ db \ Quer y .

//creates a new \yii\db\Query() object
$query=new \yii\db\Query(); 

$rows=$query->select(['emp_name','emp_salary']) //specify required columns in an array
             ->from('employee') //specify table name
             ->all(); //returns an array of rows with each row being an associative array of name-value pairs.

Podemos hacer uso de un bucle foreach para recorrer cada par nombre-valor en la matriz $ rows .

foreach ($rows as $row) {
    echo "Employee Name: ".$row['emp_name'].",Employee Salary: ".$row['emp_salary']."<br>";
}

Esto dará salida

Nombre del empleado: Kiran, Salario del empleado: 25000

Nombre del empleado: Midhun, Salario del empleado: 50000

Nombre del empleado: Jishnu, Salario del empleado: 20000

Nombre del empleado: Ajith, Salario del empleado: 25000

Nombre del empleado: Akshay, Salario del empleado: 750000

Más ejemplos

Supongamos que necesitamos encontrar el nombre de los empleados cuyo salario es igual a 25000. Podemos escribir la consulta en SQL como

select emp_name from employee where salary=25000

En Yii2, el código para generar la consulta anterior.

$query=new \yii\db\Query(); 

$rows=$query->select(['emp_name']) 
            ->from('employee')
            ->where(['emp_salary'=>25000]) //specify the condition as an associative array where key is column name
            ->all(); 

Si necesitamos encontrar nombres de empleados cuyo salario sea superior a 25000, podemos escribir el código en Yii2 como

  $rows=$query->select(['emp_name']) 
        ->from('employee')
        ->where(['>','emp_salary', 25000]) 
//Here first element in the above array specify relational operator used, second element specify the table name and third the value itself.
        ->all();  

Más verificación de condición usando where ()

Se pueden escribir múltiples condiciones usando el método where () como se indica a continuación.

// Creates a new \yii\db\Query() object
$query = new \yii\db\Query();
$rows = $query->select(['emp_name','emp_salary']) 
        ->from('employee')
        ->where(['emp_name' => 'Kiran', 'emp_salary' => 25000]) // Specify multiple conditions
        ->one(); // Returns the first row of the result

El código anterior buscará a un empleado que tenga el nombre de kiran y el salario 25000 . Si varios empleados cumplen con la condición anterior, el llamado one () se asegura de que solo se obtenga el primer resultado. Para obtener todos los resultados debes usar all () .

Tenga en cuenta que si usa all () el resultado siempre será una matriz; Incluso si hay solo uno o cero resultados. Esta matriz contiene todos los resultados como matrices o está vacía cuando no coinciden los registros. La llamada one () devolverá la matriz resultante directamente o falsa si la consulta no devuelve nada.

El código equivalente en sql se da a continuación.

select emp_name, emp_salary from employee where emp_name = 'Kiran' and emp_salary = 25000 limit 1;

A continuación se proporciona una forma alternativa de escribir la consulta anterior en Yii2.

$rows = $query->select(['emp_name', 'emp_salary']) 
    ->from('employee')
    ->where(['emp_name' => 'Kiran'])
    ->andWhere(['emp_salary' => 25000])
    ->one();

Se puede especificar un conjunto adicional de condiciones usando andWhere . Esto será útil si necesitamos agregar una verificación de condición adicional a la consulta más adelante.

Otra forma de especificar múltiples condiciones es mediante el uso del formato de operador del método where (). La consulta anterior también se puede escribir como se indica a continuación.

 $rows = $query->select(['emp_name','emp_salary']) 
    ->from('employee')
    ->where(['and', 'emp_name="kiran"', 'emp_salary=25000'])        
    ->one();

Aquí especificamos el operador ' y ' como el primer elemento de la matriz. De manera similar, también podemos usar ' o ', ' entre ', ' no entre ', ' en ', ' no en ', ' como ', ' o como ', ' no como ', ' o no como ', ' existe ' , ' no existe ', ' > ', ' <= ' etc. como operadores.

Ejemplos de uso de 'in' y 'like'

Supongamos que necesitamos encontrar empleados que tengan salarios 20000, 25000 y 50000 . En sql normal escribiríamos la consulta como

select * from employee where salary in (20000,25000,50000)

En Yii2 podemos escribir esto como se indica a continuación.

$rows = $query->from('employee')
        ->where(['emp_salary' => [20000,25000,50000]]) 
        ->all();

Otra forma de especificar la misma condición es

$rows = $query->from('employee')
    ->where(['in', 'emp_salary', [20000,25000,50000]]) // Making use of operator format of where() method
    ->all();

De manera similar, " no en " se puede especificar en lugar de " en " si queremos que todos los empleados no tengan salarios 20000, 25000 y 50000.

Ahora veamos algunos ejemplos de uso de "me gusta " dentro de la condición (). Supongamos que necesitamos encontrar a todos los empleados que tienen la cadena ' gopal ' en su nombre. Los nombres pueden ser venugopal, rajagopal, gopalakrishnan, etc. La consulta de SQL se proporciona a continuación.

select * from employee where emp_name like '%gopal%'

En Yii2 escribiremos esto como

 $rows = $query->from('employee')
        ->where(['like', 'emp_name', 'gopal']) // Making use of operator format of where() method
        ->all();

Si necesitamos encontrar a todos los empleados que tienen la cadena ' gopal ' y ' nair ' en su nombre. Podemos escribir como

   $rows = $query->from('employee')
        ->where(['like', 'emp_name', ['gopal','nair']]) // Making use of operator format of where() method
        ->all();

Esto evaluaría como

seleccione * del empleado donde emp_name como '% gopal%' y '% nair%'

De manera similar, podemos usar " no me gusta " para indicar a todos los empleados que no tienen la cadena " gopal " y " nair " en sus nombres.

Usando orderBy ()

El método orderBy () especifica el fragmento ORDER BY de una consulta SQL. Por ejemplo, considere nuestra tabla de empleados con campos emp_id, emp_first_name, emp_last_name y emp_salary. Supongamos que debemos ordenar el resultado por orden creciente de salarios de los empleados. Podemos hacerlo sql como se indica a continuación.

Select * from employee order by emp_salary

En yii2, podemos construir la consulta como se indica a continuación.

 //creates a new \yii\db\Query() object
    $query=new \yii\db\Query();

    $rows= $query->from('employee')->orderBy([
    'emp_salary' => SORT_ASC //specify sort order ASC for ascending DESC for descending      
    ])->all();

Si necesitamos ordenar a los empleados con su primer nombre en orden ascendente y luego sus salarios en orden descendente, podemos escribirlo en sql simple de la siguiente manera.

Select * from employee order by emp_first_name ASC, emp_salary DESC

El sql equivalente se puede construir usando yii2 de la siguiente manera

//creates a new \yii\db\Query() object
    $query=new \yii\db\Query();

    $rows= $query->from('employee')->orderBy([
    'emp_first_name' => SORT_ASC
    'emp_salary' => SORT_DESC      
    ])->all();

También puede especificar ORDER BY utilizando una cadena, al igual que lo hace al escribir declaraciones de SQL sin formato. Por ejemplo, la consulta anterior también se puede generar como se indica a continuación.

//creates a new \yii\db\Query() object
$query=new \yii\db\Query();
$rows=$query->from('employee')->orderBy('emp_first_name ASC, emp_salary DESC')->all();

Puede llamar a addOrderBy () para agregar columnas adicionales al fragmento ORDER BY. Por ejemplo

//creates a new \yii\db\Query() object
$query=new \yii\db\Query();
$rows=$query->from('employee')->orderBy('emp_first_name ASC')
    ->addOrderBy('emp_salary DESC')->all();


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow