サーチ…


Yii2クエリービルダーを使用する

Yii2は、データベースからデータを取得する効率的な方法を提供します。フィールドemp_id、emp_nameおよびemp_salaryを持つ単純な従業員テーブルの例を考えてください 。従業員の名前と給与を取得するために、クエリを使用します。

select emp_name,emp_salary from employee

Yii2で上記のクエリを生成するには、たくさんのメソッドがあります。メソッドの1つは、 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、従業員給与:25000

従業員名:Midhun、従業員給与:50000

従業員名:Jishnu、従業員給与:20000

従業員名:Ajith、従業員給与:25000

従業員名:Akshay、従業員給与:750000

より多くの例

給与が25000に等しい従業員の名前を見つける必要があるとします。

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()メソッドを使用して複数の条件を記述できます。

// 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とsalary 25000という名前の従業員をフェッチします。複数の従業員が上記の条件を満たす場合、call one()は最初の結果のみがフェッチされるようにします。すべての結果を取得するには、 all()を使用する必要があります。

all()を使用すると、結果は常に配列になります。結果が1つしかない場合でもこの配列には、配列としてのすべての結果が含まれています。レコードが一致しない場合は空です。クエリoneが返されない場合は、結果の配列を直接返します。

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

追加の条件のセットはandを使用して指定できます。後で条件照合を追加する必要がある場合に便利です。

複数の条件を指定するさらに別の方法は where()メソッドの演算子形式を使用することです。上記のクエリは、以下のように記述することもできます。

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

ここでは、演算子 ' and 'を配列の最初の要素として指定します。同様に、我々はまた、「 存在する 」「 好きか 」を使用する「 または 」、「 の間の 」、「 好きではない 」、「 のような 」、「 ないで 」、「 」、「 いない間の 」「 など 」することができます、 ' 存在しません '、 ' > '、 ' <= 'などがあります。

'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でないすべての従業員を取得したい場合は同様に ' in 'を ' in 'の代わりに指定できます。

次にwhere()の中で ' like 'を使う例を見てみましょう。その名前に「 gopal 」という文字列を持つすべての従業員を見つける必要があるとします。名前は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%'のような従業員からselect *

同様に、名前に「 gopal 」と「 nair 」という文字列がないすべての従業員を示すには、「 好きでない 」を使用できます。

orderBy()を使用すると、

orderBy()メソッドは、SQLクエリのORDER BYフラグメントを指定します。例えば、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();

生のSQL文を書くときと同じように、文字列を使用してORDER BYを指定することもできます。たとえば、以下のように上記のクエリを生成することもできます。

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow