yii2
Arbeta med databaser
Sök…
Med hjälp av Yii2-frågeställaren
Yii2 ger effektiva sätt att hämta data från databasen. Överväg ett exempel på en enkel medarbetartabell med fält emp_id, emp_name och emp_salary . För att hämta medarbetarnas namn och deras löner använder vi frågan.
select emp_name,emp_salary from employee
För att generera frågan ovan i Yii2 finns det många metoder. En av metoden är att använda ett yii \ db \ Quer y- objekt.
//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.
Vi kan använda en förhandslinga för att gå igenom varje namnvärdespar i $ rader array.
foreach ($rows as $row) {
echo "Employee Name: ".$row['emp_name'].",Employee Salary: ".$row['emp_salary']."<br>";
}
Detta kommer att matas ut
Anställdas namn: Kiran, anställds lön: 25000
Anställdas namn: Midhun, anställds lön: 50000
Anställdas namn: Jishnu, anställds lön: 20000
Anställdas namn: Ajith, anställds lön: 25000
Anställdas namn: Akshay, anställds lön: 750000
Fler exempel
Anta att vi måste hitta namnet på anställda vars lön är lika med 25000. Vi kan skriva frågan i SQL som
select emp_name from employee where salary=25000
I Yii2, koden för att generera ovanstående fråga
$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();
Om vi behöver hitta anställdnamn vars lön är större än 25000, kan vi skriva koden i Yii2 som
$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();
Mer tillståndskontroll med hjälp av var ()
Flera villkor kan skrivas med hjälp av var () -metoden enligt nedan.
// 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
Ovanstående kod hämtar en anställd med namnet kiran och lön 25000 . Om flera anställda uppfyller ovanstående villkor, ringer samtalet () att endast det första resultatet hämtas. För att hämta alla resultat ska du använda alla () .
Observera att om du använder alla () kommer resultatet alltid att vara en matris; Även om det bara finns ett eller noll resultat. Den här matrisen innehåller alla resultat som matriser eller är tom när inga poster matchar. Samtalet en () returnerar den resulterande matrisen direkt eller falsk om frågan inte returnerar någonting.
Motsvarande kod i sql anges nedan.
select emp_name, emp_salary from employee where emp_name = 'Kiran' and emp_salary = 25000 limit 1;
Ett alternativt sätt att skriva ovanstående fråga i Yii2 ges nedan.
$rows = $query->select(['emp_name', 'emp_salary'])
->from('employee')
->where(['emp_name' => 'Kiran'])
->andWhere(['emp_salary' => 25000])
->one();
Ytterligare uppsättning villkor kan specificeras med och där . Detta kommer att vara användbart om vi behöver lägga till ytterligare tillståndskontroll i frågan senare.
Ännu ett sätt att specificera flera villkor är genom att använda operatörsformatet för var () -metoden. Frågan ovan kan också skrivas enligt nedan.
$rows = $query->select(['emp_name','emp_salary'])
->from('employee')
->where(['and', 'emp_name="kiran"', 'emp_salary=25000'])
->one();
Här anger vi operatören ' och ' som det första elementet i matrisen. På liknande sätt kan vi också använda ' eller ', ' mellan ', ' inte mellan ', ' in ', ' inte i ', ' som ', ' eller liknande ', ' inte som ', ' eller inte som ', ' finns ' , ' existerar inte ', ' > ', ' <= ' etc som operatörer.
Exempel på att använda 'in' och 'som'
Anta att vi måste hitta de anställda som har löner 20000, 25000 och 50000 . I normal sql skulle vi skriva frågan som
select * from employee where salary in (20000,25000,50000)
I Yii2 kan vi skriva detta enligt nedan.
$rows = $query->from('employee')
->where(['emp_salary' => [20000,25000,50000]])
->all();
Ett annat sätt att specificera samma villkor är
$rows = $query->from('employee')
->where(['in', 'emp_salary', [20000,25000,50000]]) // Making use of operator format of where() method
->all();
På liknande sätt kan " inte in " anges istället för " in " om vi vill få alla anställda som inte har lön 20000, 25000 och 50000.
Låt oss nu se några exempel på att använda " som " inuti där () tillstånd. Anta att vi måste hitta alla anställda som har strängen ' gopal ' i sitt namn. Namnen kan vara venugopal, rajagopal, gopalakrishnan etc. SQL-frågan anges nedan.
select * from employee where emp_name like '%gopal%'
I Yii2 kommer vi att skriva detta som
$rows = $query->from('employee')
->where(['like', 'emp_name', 'gopal']) // Making use of operator format of where() method
->all();
Om vi behöver hitta alla anställda som har strängen ' gopal ' och ' nair ' i sitt namn. Vi kan skriva som
$rows = $query->from('employee')
->where(['like', 'emp_name', ['gopal','nair']]) // Making use of operator format of where() method
->all();
Detta skulle utvärderas som
välj * från anställd där emp_name som '% gopal%' och '% nair%'
På liknande sätt kan vi använda ' not like ' för att indikera alla anställda som inte har strängen ' gopal ' och ' nair ' i sina namn.
Använda orderBy ()
Metoden orderBy () anger ORDER BY-fragmentet i en SQL-fråga. För exempel att betrakta vår anställdstabell med fält emp_id, emp_first_name, emp_last_name och emp_salary. Antar att vi måste beställa resultatet genom att öka ordningen på anställdas löner. Vi kan göra det i som anges nedan.
Select * from employee order by emp_salary
I yii2 kan vi bygga frågan enligt nedan
//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();
Om vi behöver beställa de anställda med sitt förnamn i stigande ordning och sedan deras löner i fallande ordning, kan vi skriva det i vanlig sql enligt följande.
Select * from employee order by emp_first_name ASC, emp_salary DESC
Den ekvivalenta sql kan byggas med yii2 enligt följande
//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();
Du kan också specificera ORDER BY med hjälp av en sträng, precis som du gör när du skriver råa SQL-satser. Exempelvis kan frågan ovan genereras enligt nedan.
//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();
Du kan ringa addOrderBy () för att lägga till ytterligare kolumner i ORDER BY-fragmentet. Till exempel
//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();