【Yii2】Yii2数据库操作

PHP开发 小铁匠 2019-03-21

声明活动记录类

namespace app\models;

use yii\db\ActiveRecord;

class Customer extends ActiveRecord
{
    
    public static function tableName()
    {
        return "customer";  // 没有设置表前缀时
        return "{{%customer}}"; // 设置表前缀时
    }
}

查询数据

  1. 查询单条

    Model::find()->one();
    Model::findOne($id);
    Model::findOne($where);
    
  2. 查询多条

    Model::find()->all();
    Model::find()->findBySql($sql)->all();
    Model::find()->findAll($ids);
    Model::find()->findAll($where);
    
  3. 查询统计

    Model::find()->count();
    
  4. 查询集合

    Model::find()->indexBy('id')->all();
    
  • 查询可加入条件

    $model->where($where)->orderBy($order)->asArray()->batch()->each()->with();
    
    where 查询条件
    orderBy 排序
    asArray 返回数组格式的数据
    batch 限制查询条数
    with 关联查询
    

关联查询

class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        // Customer has_many Order via Order.customer_id -> id
        return $this->hasMany(Order::className(), ['customer_id' => 'id']);
    }
}

class Order extends \yii\db\ActiveRecord
{
    // Order has_one Customer via Customer.id -> customer_id
    public function getCustomer()
    {
        return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
    }
}

完成上述声明后,就可以通过定义相应的getter方法来像访问对象属性一样获取关联数据:

// get the orders of a customer
$customer = Customer::findOne(1);
$orders = $customer->orders;  // $orders is an array of Order objects

提示:如果你再次访问 $customer->orders ,并不会重复执行上述第2行SQL查询。这条查询语句只在表达式第一次被访问时才被执行。后续的访问将直接返回内部缓冲数据。如果你想重新执行查询,只需要先调用一下unset来清除缓存: unset($customer->orders);

事务

$transaction = Yii::$app->db->beginTransaction(); // 启用事务
try {
    Article::find()->all();
    Admin::findOne(1);
    // ... executing other SQL statements ...
    $transaction->commit(); // 提交事务
} catch (Exception $e) {
    $transaction->rollBack(); // 事务回滚
}
------ 本文结束 感谢阅读 ------