Zoeken…


Yii2 querybuilder gebruiken

Yii2 biedt efficiënte manieren om gegevens uit de database op te halen. Beschouw een voorbeeld van een eenvoudige medewerkertabel met velden emp_id, emp_name en emp_salary . Om de werknemersnamen en hun salarissen op te halen, gebruiken we de query.

select emp_name,emp_salary from employee

Om de bovenstaande query in Yii2 te genereren, zijn er veel methoden. Een van de methoden is het gebruik van een yii \ db \ Quer y- object.

//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.

We kunnen gebruik maken van een foreach-lus om elk naam-waardepaar in de $ rijen- reeks te doorlopen.

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

Dit wordt uitgevoerd

Naam werknemer: Kiran, salaris werknemer: 25000

Naam werknemer: Midhun, Salaris werknemer: 50000

Naam werknemer: Jishnu, Salaris werknemer: 20000

Werknemersnaam: Ajith, werknemerssalaris: 25000

Naam werknemer: Akshay, salaris werknemer: 750000

Meer voorbeelden

Stel dat we de naam moeten vinden van werknemers wier salaris gelijk is aan 25000. We kunnen de vraag in sql schrijven als

select emp_name from employee where salary=25000

In Yii2, de code voor het genereren van de bovenstaande query

$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(); 

Als we werknemersnamen moeten vinden waarvan het salaris hoger is dan 25000, kunnen we de code in Yii2 schrijven als

  $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();  

Meer conditiecontrole met behulp van waar ()

Meerdere voorwaarden kunnen worden geschreven met behulp van de methode where () zoals hieronder aangegeven.

// 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

De bovenstaande code haalt een werknemer op met de naam kiran en salaris 25000 . Als meerdere werknemers aan de bovenstaande voorwaarde voldoen, zorgt de aanroep one () ervoor dat alleen het eerste resultaat wordt opgehaald. Als u alle resultaten wilt ophalen, moet u all () gebruiken .

Merk op dat als u all () gebruikt, het resultaat altijd een array zal zijn; Zelfs als er slechts één of nul resultaten zijn. Deze array bevat alle resultaten als arrays of is leeg als er geen records overeenkomen. De aanroep one () retourneert de resulterende array direct of false als de query niets retourneert.

De equivalente code in sql wordt hieronder gegeven.

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

Een alternatieve manier om de bovenstaande query in Yii2 te schrijven, wordt hieronder gegeven.

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

Extra set voorwaarden kan worden gespecificeerd met andWhere . Dit is handig als we later extra voorwaardecontrole aan de query moeten toevoegen.

Nog een andere manier om meerdere voorwaarden op te geven, is door gebruik te maken van het operatorformaat van de methode where (). De bovenstaande query kan ook worden geschreven zoals hieronder aangegeven.

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

Hier specificeren we de operator ' en ' als het eerste element in de array. Op dezelfde manier kunnen we ook ' of ', ' tussen ', ' niet tussen ', ' in ', ' niet in ', ' zoals ', ' of zoals ', ' niet zoals ', ' of niet zoals ', ' bestaat ' gebruiken , ' bestaat niet ', ' > ', ' <= ' enz. als operatoren.

Voorbeelden van het gebruik van 'in' en 'like'

Stel dat we de werknemers moeten vinden met een salaris van 20000, 25000 en 50000 . In normale sql zouden we de query schrijven als

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

In Yii2 kunnen we dit schrijven zoals hieronder aangegeven.

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

Een andere manier om dezelfde voorwaarde op te geven is

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

Op dezelfde manier kan ' niet in ' worden opgegeven in plaats van ' in ' als we alle werknemers zonder salaris 20000, 25000 en 50000 willen krijgen.

Laten we nu enkele voorbeelden bekijken van het gebruik van ' like ' in de voorwaarde where (). Stel dat we alle werknemers moeten vinden met de string ' gopal ' in hun naam. De namen kunnen venugopal, rajagopal, gopalakrishnan enz. Zijn. De sql-query wordt hieronder gegeven.

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

In Yii2 zullen we dit schrijven als

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

Als we alle werknemers moeten vinden met de string ' gopal ' en ' nair ' in hun naam. We kunnen schrijven als

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

Dit zou evalueren als

selecteer * van werknemer waarbij emp_name zoals '% gopal%' en '% nair%'

Op dezelfde manier kunnen we ' niet leuk ' gebruiken om aan te geven dat alle werknemers niet de tekenreeks ' gopal ' en ' nair ' in hun naam hebben.

OrderBy () gebruiken

De methode orderBy () geeft het ORDER BY-fragment van een SQL-query aan. Overweeg bijvoorbeeld onze personeelstabel met velden emp_id, emp_first_name, emp_last_name en emp_salary. Stel dat we het resultaat moeten ordenen door de volgorde van de salarissen van de medewerkers te verhogen. We kunnen het doen in sql zoals hieronder gegeven.

Select * from employee order by emp_salary

In yii2 kunnen we de query maken zoals hieronder aangegeven

 //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();

Als we de werknemers met hun voornaam in oplopende volgorde en vervolgens hun salarissen in aflopende volgorde moeten bestellen, kunnen we het als volgt in gewone sql schrijven.

Select * from employee order by emp_first_name ASC, emp_salary DESC

De equivalente sql kan als volgt worden opgebouwd met 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();

U kunt ook ORDER BY specificeren met behulp van een string, net zoals bij het schrijven van onbewerkte SQL-instructies. De bovenstaande zoekopdracht kan bijvoorbeeld ook worden gegenereerd zoals hieronder aangegeven.

//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();

U kunt addOrderBy () aanroepen om extra kolommen aan het ORDER BY-fragment toe te voegen. Bijvoorbeeld

//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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow