一.聲明AR類(模型層)
namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord
{
/**
* @return string 返回該AR類關聯的數據表名
*/
public static function tableName()
{
return 'customer';
}
}
輸出sql:createCommand()->getRawSql();
二.使用AR類 進行增刪改查(控制器層)
// "id" 和 "mail" 是 $customer 對象所關聯的數據表的對應字段名
$id = $customer->id;
$email = $customer->email;
AR 提供了兩種方法來構建 DB 查詢並向 AR 實例裏填充數據:
yii\db\ActiveRecord::find()
yii\db\ActiveRecord::findBySql()
1.簡單查詢方法
Customer::find()->one(); 此方法返回一條數據;
Customer::find()->all(); 此方法返回所有數據;
Customer::find()->count(); 此方法返回記錄的數量;
Customer::find()->average(); 此方法返回指定列的平均值;
Customer::find()->min(); 此方法返回指定列的最小值 ;
Customer::find()->max(); 此方法返回指定列的最大值 ;
Customer::find()->scalar(); 此方法返回值的第一行第一列的查詢結果;
Customer::find()->column(); 此方法返回查詢結果中的第一列的值;
Customer::find()->exists(); 此方法返回一個值指示是否包含查詢結果的數據行;
Customer::find()->asArray()->one(); 以數組形式返回一條數據;
Customer::find()->asArray()->all(); 以數組形式返回所有數據;
Customer::find()->where($condition)->asArray()->one(); 根據條件以數組形式返回一條數據;
Customer::find()->where($condition)->asArray()->all(); 根據條件以數組形式返回所有數據;
Customer::find()->where($condition)->asArray()->orderBy('id DESC')->all(); 根據條件以數組形式返回所有數據,並根據ID倒序;
2.findOne()和findAll()
// 查詢年齡爲30,狀態值爲1的客戶
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
// 查詢id值爲10,11,12的客戶
$customers = Customer::findAll([10, 11, 12]);
$customers = Customer::find()->where(['id' => [10, 11, 12]])->all();
3.where()條件
$customers = Customer::find()->where($cond)->all();
$cond寫法舉例:
// SQL: (type = 1) AND (status = 2).
$cond = ['type' => 1, 'status' => 2]
// SQL:(id IN (1, 2, 3)) AND (status = 2)
$cond = ['id' => [1, 2, 3], 'status' => 2]
//SQL:status IS NULL
$cond = ['status' => null]
[[and]]:將不同的條件組合在一起,用法舉例:
//SQL:`id=1 AND id=2`
$cond = ['and', 'id=1', 'id=2']
//SQL:`type=1 AND (id=1 OR id=2)`
$cond = ['and', 'type=1', ['or', 'id=1', 'id=2']]
[[or]]:
//SQL:`(type IN (7, 8, 9) OR (id IN (1, 2, 3)))`
$cond = ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]
[[not]]:
//SQL:`NOT (attribute IS NULL)`
$cond = ['not', ['attribute' => null]]
[[between]]: not between 用法相同
//SQL:`id BETWEEN 1 AND 10`
$cond = ['between', 'id', 1, 10]
[[in]]: not in 用法類似
//SQL:`id IN (1, 2, 3)`
$cond = ['in', 'id', [1, 2, 3]]
//IN條件也適用於多字段
$cond = ['in', ['id', 'name'], [['id' => 1, 'name' => 'foo'], ['id' => 2, 'name' => 'bar']]]
//也適用於內嵌sql語句
$cond = ['in', 'user_id', (new Query())->select('id')->from('users')->where(['active' => 1])]
[[like]]:
//SQL:`name LIKE '%tester%'`
$cond = ['like', 'name', 'tester']
//SQL:`name LIKE '%test%' AND name LIKE '%sample%'`
$cond = ['like', 'name', ['test', 'sample']]
//SQL:`name LIKE '%tester'`
$cond = ['like', 'name', '%tester', false]
此外,您可以指定任意運算符如下
//SQL:`id >= 10`
$cond = ['>=', 'id', 10]
//SQL:`id != 10`
$cond = ['!=', 'id', 10]
3.增刪改
// 插入新客戶的記錄
$customer = new Customer();
$customer->name = 'James';
$customer->email = '[email protected]';
$customer->save(); // 等同於 $customer->insert();
// 更新現有客戶記錄
$customer = Customer::findOne($id);
$customer->email = '[email protected]';
$customer->save(); // 等同於 $customer->update();
// 刪除已有客戶記錄
$customer = Customer::findOne($id);
$customer->delete();
// 刪除多個年齡大於20,性別爲男(Male)的客戶記錄
Customer::deleteAll('age > :age AND gender = :gender', [':age' => 20, ':gender' => 'M']);
// 所有客戶的age(年齡)字段加1:
Customer::updateAllCounters(['age' => 1]);
4.兩表聯查
4.兩表聯查
[[ActiveRecord::hasOne()]]:返回對應關係的單條記錄
[[ActiveRecord::hasMany()]]:返回對應關係的多條記錄
//客戶表Model:CustomerModel
//訂單表Model:OrdersModel
//首先要建立表與表之間的關係
//在CustomerModel中添加與訂單的關係
模型層:
Class CustomerModel extends \yii\db\ActiveRecord
{
...
public function getOrders()
{
//客戶和訂單是一對多的關係所以用hasMany
//此處OrdersModel在CustomerModel頂部別忘了加對應的命名空間
//id對應的是OrdersModel的id字段,order_id對應CustomerModel的order_id字段
return $this->hasMany(OrdersModel::className(), ['id'=>'order_id']);
}
}
控制器層:
public function actionIndex{
$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
$orders = $customer->getOrders();
或者
$orders = $customer->orders; // 魔術方法自動補全 getOrders();
//關聯查詢的多次查詢
$customer = Customer::find()->with('order')->all();
foreach($customer as $customer){
$orders = $customer ->orders;
}
}
視圖層向控制器層傳值
首先在所在的視圖層 use yii\helpers\Url;使用
Get方式
其次使用<?= Url::to(['控制器/方法'])?>?參數=值