yii2
Работа с базами данных
Поиск…
Использование построителя запросов Yii2
Yii2 предоставляет эффективные способы извлечения данных из базы данных. Рассмотрим пример простой таблицы сотрудников с полями emp_id, emp_name и emp_salary . Чтобы получить имена сотрудников и их зарплаты, мы используем запрос.
select emp_name,emp_salary from employee
Чтобы сгенерировать вышеуказанный запрос в Yii2, существует множество методов. Один из методов заключается в использовании объекта 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.
Мы можем использовать цикл foreach для циклического прохождения каждой пары имя-значение в массиве $ rows .
foreach ($rows as $row) {
echo "Employee Name: ".$row['emp_name'].",Employee Salary: ".$row['emp_salary']."<br>";
}
Это приведет к выводу
Имя сотрудника: Kiran, Employee Зарплата: 25000
Имя сотрудника: Midhun, Employee Зарплата: 50000
Имя сотрудника: Jishnu, Employee Зарплата: 20000
Имя сотрудника: Ajith, Employee Зарплата: 25000
Имя сотрудника: Akshay, Employee Зарплата: 750000
Другие примеры
Предположим, нам нужно найти имя сотрудников, чья зарплата равна 25000. Мы можем написать запрос в sql как
select emp_name from employee where salary=25000
В Yii2 код для генерации вышеуказанного запроса
$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();
Если нам нужно найти имена сотрудников, чья зарплата больше 25000, мы можем написать код в Yii2 как
$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();
Проверка состояния с использованием where ()
Несколько условий могут быть записаны с использованием метода where (), как показано ниже.
// 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
Вышеприведенный код получит сотрудника с именем kiran и зарплатой 25000 . Если несколько сотрудников удовлетворяют вышеуказанному условию, вызов one () гарантирует получение только первого результата. Чтобы получить все результаты, вы должны использовать all () .
Обратите внимание: если вы используете all (), результат всегда будет массивом; Даже если есть только один или нулевой результат. Этот массив содержит все результаты как массивы или пуст, когда никакие записи не совпадают. Вызов one () вернет результирующий массив напрямую или false, если запрос ничего не возвращает.
Ниже приведен эквивалентный код в sql.
select emp_name, emp_salary from employee where emp_name = 'Kiran' and emp_salary = 25000 limit 1;
Ниже приведен альтернативный способ написания вышеуказанного запроса в Yii2.
$rows = $query->select(['emp_name', 'emp_salary'])
->from('employee')
->where(['emp_name' => 'Kiran'])
->andWhere(['emp_salary' => 25000])
->one();
Дополнительный набор условий можно задать с помощью andWhere . Это будет полезно, если нам нужно добавить дополнительную проверку условий в запрос позже.
Еще один способ указать несколько условий - использовать формат оператора метода where (). Вышеприведенный запрос также может быть записан как указано ниже.
$rows = $query->select(['emp_name','emp_salary'])
->from('employee')
->where(['and', 'emp_name="kiran"', 'emp_salary=25000'])
->one();
Здесь мы указываем оператор ' и ' как первый элемент в массиве. Точно так же мы можем также использовать « или », « между », « не между », « in », « not in », « like », « like », « not like », « или не нравится », « существует », , ' не существует ', ' > ', ' <= ' и т. д. как операторы.
Примеры использования 'in' и 'like'
Предположим, нам нужно найти сотрудников, имеющих зарплаты 20000, 25000 и 50000 . В обычном sql мы будем писать запрос как
select * from employee where salary in (20000,25000,50000)
В Yii2 мы можем написать это, как показано ниже.
$rows = $query->from('employee')
->where(['emp_salary' => [20000,25000,50000]])
->all();
Другой способ указать одно и то же условие:
$rows = $query->from('employee')
->where(['in', 'emp_salary', [20000,25000,50000]]) // Making use of operator format of where() method
->all();
Аналогично « не в » можно указать вместо « в », если мы хотим, чтобы все сотрудники не имели зарплаты 20000, 25000 и 50000.
Теперь давайте рассмотрим некоторые примеры использования « like » внутри where (). Предположим, нам нужно найти всех сотрудников, имеющих строку « гопал » от их имени. Имена могут быть venugopal, rajagopal, gopalakrishnan и т. Д. Запрос sql приведен ниже.
select * from employee where emp_name like '%gopal%'
В Yii2 мы будем писать это как
$rows = $query->from('employee')
->where(['like', 'emp_name', 'gopal']) // Making use of operator format of where() method
->all();
Если нам нужно найти всех сотрудников, у которых есть строка « gopal » и « nair » от их имени. Мы можем написать как
$rows = $query->from('employee')
->where(['like', 'emp_name', ['gopal','nair']]) // Making use of operator format of where() method
->all();
Это будет оцениваться как
выберите * у сотрудника, где emp_name, например «% gopal%» и «% nair%»,
Аналогичным образом мы можем использовать « не похоже », чтобы указать всем сотрудникам, не имеющим в своих именах строку « гопал » и « нир ».
Использование orderBy ()
Метод orderBy () указывает фрагмент ORDER BY SQL-запроса. Например, рассмотрим нашу таблицу сотрудников с полями emp_id, emp_first_name, emp_last_name и emp_salary. Предположим, нам нужно заказать результат, увеличив порядок зарплат сотрудников. Мы можем сделать это в sql, как указано ниже.
Select * from employee order by emp_salary
В yii2 мы можем построить запрос, как указано ниже
//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();
Если нам нужно заказать сотрудников с их именем в порядке возрастания, а затем их зарплату в порядке убывания, мы можем написать это в обычном sql следующим образом.
Select * from employee order by emp_first_name ASC, emp_salary DESC
Эквивалентный sql можно построить с помощью yii2 следующим образом
//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();
Вы также можете указать ORDER BY, используя строку, точно так же, как и при написании необработанных SQL-операторов. Например, вышеупомянутый запрос также может быть сгенерирован, как указано ниже.
//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();
Вы можете вызвать addOrderBy (), чтобы добавить дополнительные столбцы в фрагмент ORDER BY. Например
//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();