ActiveRecord活動記錄類


.聲明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值爲1011,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()]]:返回對應關係的多條記錄

 

//客戶表ModelCustomerModel

//訂單表ModelOrdersModel

 

//首先要建立表與表之間的關係

//CustomerModel中添加與訂單的關係

  

模型層:    

Class CustomerModel extends \yii\db\ActiveRecord

{

    ...

    

    public function getOrders()

    {

        //客戶和訂單是一對多的關係所以用hasMany

        //此處OrdersModelCustomerModel頂部別忘了加對應的命名空間

        //id對應的是OrdersModelid字段,order_id對應CustomerModelorder_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(['控制器/方法'])?>?參數=

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章