前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Yii2 学习笔记之数据库篇

Yii2 学习笔记之数据库篇

作者头像
guanguans
发布于 2018-05-09 08:31:11
发布于 2018-05-09 08:31:11
3.3K00
代码可运行
举报
文章被收录于专栏:琯琯博客琯琯博客
运行总次数:0
代码可运行

1.简单查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[one()]]     // 根据查询结果返回查询的第一条记录。
[[all()]]     // 根据查询结果返回所有记录。
[[count()]]   // 返回记录的数量。
[[sum()]]     // 返回指定列的总数。
[[average()]] // 返回指定列的平均值。
[[min()]]     // 返回指定列的最小值。
[[max()]]     // 返回指定列的最大值。
[[scalar()]]  // 返回查询结果的第一行中的第一列的值。
[[column()]]  // 返回查询结果中的第一列的值。
[[exists()]]  // 返回一个值,该值指示查询结果是否有数据。
[[where()]]   // 添加查询条件
[[with()]]    // 该查询应执行的关系列表。
[[indexBy()]] // 根据索引的列的名称查询结果。
[[asArray()]] // 以数组的形式返回每条记录。
应用实例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.关联查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[ActiveRecord::hasOne()]]  //返回对应关系的单条记录
[[ActiveRecord::hasMany()]] //返回对应关系的多条记录

应用场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 客户表Model:CustomerModel
 * 订单表Model:OrdersModel
 * 国家表Model:CountrysModel
 * 首先要建立表与表之间的关系
 * 在CustomerModel中添加与订单的关系
 */
Class CustomerModel extends ActiveRecord
{
    /**
     * 客户和订单是一对多的关系所以用hasMany
     * 此处OrdersModel在CustomerModel顶部别忘了加对应的命名空间
     * customer_id对应OrdersModel的customer_id字段
     * id对应的是CustomerModel的id字段
     */
    public function getOrders()
    {
        return $this->hasMany(OrdersModel::className(), ['customer_id'=>'id']);
    }

    /**
     * 可以定义多个orders的关联数据,返回价格大于100的订单
     */
    public function getBigOrders($priceNum=100)
    {
        return $this->hasMany(OrdersModel::className(), ['customer_id'=>'id'])
                    ->where('price_num>:threshold', [':threshold' => $threshold]);
    }

    /**
     * 客户和国家是一对一的关系所以用hasOne
     */
    public function getCountry()
    {
        return $this->hasOne(CountrysModel::className(), ['country_id'=>'id']);
    }
}
1.直接使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 查询单表数据,调用相关数据,再重新查询SQL
 * 上面的代码会生成如下sql语句
 * SELECT * FROM customer
 * SELECT * FROM country WHERE id=1;
 * 如果下一次调用$customer->getCountry()时,不想使用被缓存的数据,可以使用unset($customer->country);来清除缓存,那么下次调用则会重新执行查询SQL。
 */
$customer = CustomerModel::find();
var_dump($customer->getCountry()); // 第一次使用,会进行SQL查询
var_dump($customer->getCountry())  // 第二次使用,因为被缓存了,直接调用。

var_dump($customer->orders);    //如果以属性的方式调用,会直接返回模型的结果
var_dump($customer->bigOrders); //关联数据中价格大于100的订单,
var_dump($customer->getBigOrders(200)->all()); //关联数据中价格大于200的订单,如果以函数的方式调用,会返回一个 ActiveQuery 对象
2.使用with()
  • with例子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在SQL中一次性级联查询,调用相关数据,都直接在查询出来的数据中直接获取
// 查询客户与他们的订单和国家
$customerList = CustomerModel::find()->with('orders', 'country')->all();
foreach($customerList as $customer){
    // 调用时,则不会请求SQL查询,因为已经在上一个步骤查询并缓存好了。
    var_dump($customer->orders);
    var_dump($customer->country);
}

// 查询客户与他们的订单和订单的发货地址
CustomerModel::find()->with('orders.address')->all();

// 查询客户与他们的国家和状态为1的订单
CustomerModel::find()->with([
    'orders' => function ($query) {
        $query->andWhere('status = 1');
        },
        'country',
])->all();

// 1. 在查询时加了->select();如下,要加上order_id,即关联的字段(比如:order_id)比如要在select中,否则会报错:undefined index order_id
// 查询客户与他们的订单和国家
CustomerModel::find()->select('order_id,id,name')->with('orders')->all();
  • 给with加过滤条件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. 查询一个客户大于100的订单,可使用ActiveQuery方式
//首先执行sql: SELECT * FROM customer WHERE id=1
$customer = Customer::findOne(1);

// 再执行查询订单的sql语句:SELECT * FROM order WHERE customer_id=1 AND subtotal>100
$orders = $customer->getOrders()->where('price_num>100')->all();

// 2. 查询100个客户的,每个客户的价格大于100的订单
// 下面的代码会执行sql语句: 
// SELECT * FROM customer LIMIT 100
// SELECT * FROM order WHERE customer_id IN (1,2,...) AND subtotal>100
$customerList = Customer::find()->limit(100)->with([
    'orders' => function($query) {
        $query->andWhere('price_num>100');
    },
])->all();
3.使用joinWith()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在SQL中一次性级联查询,调用相关数据,都直接在查询出来的数据中直接获取
// 查询客户与他们的订单和国家
$customerList = CustomerModel::find()->joinWith('orders')->all();
foreach($customerList as $customer){
    //调用时,则不会请求SQL查询,因为已经在上一个步骤查询并缓存好了。
    var_dump($customer->orders);
    var_dump($customer->country);
}
4.joinWith与with的区别

with方式原理流程: 总共执行了2条SQL语句: A) 先执行主表SQL:SELECT * FROM order B) 再执行关联表SQL:SELECT * FROM user WHERE user_id IN (1,2,…) C) 再通过关联表SQL数据进行内存分配到各自的主表的每条数据上。

joinWith方式: 流程和with一样。只有A步骤不一样,A步骤的主表查询出使用的是关联SQL查询,如 SELECT * FROM order LEFT JOIN user ON order.user_id=[user.id](http://user.id)

3.常用案例

findOne()和findAll():
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查询key值为10的客户
$customer = Customer::findOne(10);
$customer = Customer::find()->where(['id' => 10])->one();

// 查询年龄为30,状态值为1的客户
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();

// 查询key值为10的所有客户
$customers = Customer::findAll(10);
$customers = Customer::find()->where(['id' => 10])->all();

// 查询key值为10,11,12的客户
$customers = Customer::findAll([10, 11, 12]);
$customers = Customer::find()->where(['id' => [10, 11, 12]])->all();

// 查询年龄为30,状态值为1的所有客户
$customers = Customer::findAll(['age' => 30, 'status' => 1]);
$customers = Customer::find()->where(['age' => 30, 'status' => 1])->all();
where()条件:

$customers = Customer::find()->where($cond)->all(); $cond写法举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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]]:将不同的条件组合在一起,用法举例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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]]:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SQL: (type IN (7, 8, 9) OR (id IN (1, 2, 3)))
$cond = ['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]
[[not]]:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SQL: NOT (attribute IS NULL)
$cond = ['not', ['attribute' => null]]
[[between]]: not between 用法相同
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//SQL: id BETWEEN 1 AND 10
$cond = ['between', 'id', 1, 10]
[[in]]: not in 用法类似
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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]]:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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]
[[exists]]: not exists用法类似
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SQL: EXISTS (SELECT "id" FROM "users" WHERE "active"=1)
$cond = ['exists', (new Query())->select('id')->from('users')->where(['active' => 1])]

此外,您可以指定任意运算符如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SQL: id >= 10
$cond = ['>=', 'id', 10]
// SQL: id != 10
$cond = ['!=', 'id', 10]
常用查询:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// WHERE admin_id >= 10 LIMIT 0,10
User::find()->select('*')->where(['>=', 'admin_id', 10])->offset(0)->limit(10)->all()
// SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`   
$subQuery = (new Query())->select('COUNT(*)')->from('user');    
$query = (new Query())->select(['id', 'count' => $subQuery])->from('post');
// SELECT DISTINCT `user_id` ... 
User::find()->select('user_id')->distinct();
更新:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// update();
// runValidation boolen 是否通过validate()校验字段 默认为true 
// attributeNames array 需要更新的字段 
$model->update($runValidation , $attributeNames);  

// updateAll();
// update customer set status = 1 where status = 2
Customer::updateAll(['status' => 1], 'status = 2'); 

// update customer set status = 1 where status = 2 and uid = 1;
Customer::updateAll(['status' => 1], ['status'=> '2','uid'=>'1']);
删除:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$model = Customer::findOne($id);
$model->delete();
$model->deleteAll(['id'=>1]);
批量插入:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Yii::$app->db->createCommand()->batchInsert(
        UserModel::tableName(),
        ['user_id','username'],
        [
            ['1','test1'],
            ['2','test2'],
            ['3','test3']
        ]
    )->execute();
事务:

普通事务,用于与 ajaxbtn 结合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function saveWithTrans()
{
    $transaction = Yii::$app->db->beginTransaction();
    $errors = [];

    try {
        //1.事件一todo~~~
        if(!$this->save()){
            $errors = $this->errors;
            throw new \Exception();
        }
        //2.事件二todo~~~
        $arr = explode(',', $this->tag);
        Tag::deleteAll(['in', 'name', $arr]);
        //3.事件三todo~~~
        foreach ($arr as $val){
            $model = new Tag();
            $model->id = CommonUtil::uuid();
            $model->name = $val;
            if(!$model->save()){
                $errors = $model->errors;
                throw new \Exception();
            }
        }
        $transaction->commit();
    } catch (\Exception $e) {
        $transaction->rollBack();
    }

    return $errors;
}

// 调用方法
if (!empty($errors = $model->saveWithTrans())) {
    jsonFail($errors);
}
jsonSuccess();
// 当调用该事务方法后,得到errors的返回值,如果返回值为空,则执行成功,不为空,则表示有错误,则可以将错误进行打印处理。

API事务,常用于API调用的时候,当然AJAXBTN也能用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function saveWithTrans()
{
    $transaction = Yii::$app->db->beginTransaction();
    $error = '';
    try {
        //1.事件一todo~~~
        if(!$this->save()){
            $error = firstError($this);
            throw new \Exception();
        }
        //2.事件二todo~~~
        $arr = explode(',', $this->tag);
        Tag::deleteAll(['in', 'name', $arr]);
        //3.事件三todo~~~
        foreach ($arr as $val){
            $model = new Tag();
            $model->id = CommonUtil::uuid();
            $model->name = $val;
            if(!$model->save()){
                $error = firstError($model);
                throw new \Exception();
            }
        }
        $transaction->commit();
    } catch (\Exception $e) {
        $transaction->rollBack();
    }

    return $error;
}

// 调用方法
if (!empty($error = $model->saveWithTrans())) {
    jsonFail($error);
}
jsonSuccess();

// 当调用该事务方法后,得到error的返回值,如果返回值为空,则执行成功,不为空,则表示有错误,则可以将错误进行打印处理。
查看执行 sql
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// UserModel 
$query = UserModel::find()->where(['status'=>1]); 
echo $query->createCommand()->getRawSql();

(完)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
​小程序商城的火爆该如何把握2019年小程序创业方向
[小程序商城的火爆该如何把握2019年小程序创业方向.jpg] 经过一年多的摸索,小程序商城的热火朝天让很多人意想不到,微信用户流量红利逐渐出现,现在小程序不仅给用户带来了方便,也给企业和商家带来了很
闪云科技小程序
2019/04/04
4100
​小程序商城的火爆该如何把握2019年小程序创业方向
微信小程序商城社交+电商购物获取流量多样化更能提高拉新与转化
对于微信平台来讲,电商可是离用户钱包是最近的,它肯定也想从这块蛋糕中分得一块,近期小程序也陆续开放了许多与电商有关的功能,加之创业者许多成功的先例,小程序走电商之路毫无疑问是可行的。速成应用小程序给大家介绍小程序商城到底有哪些优势?
速成应用小程序开发平台
2018/07/09
5650
10 个理由告诉你,小程序才是电商的正确打开方式!
最近,有些看过我们之前推荐的电商模版的朋友纷纷表示:你们推荐的模版啊,靠谱!看衰小程序这么久了,差点被你们「掰弯」。BUT,要想让我们用你推荐的模版,有几个问题不问不快:
知晓君
2018/08/01
5170
为什么要做微信小程序?因为客户在这里呀,方法已经告诉你,快来看看怎么飞!
小程序未来会如何发展?商家现在是否要布局小程序?这个问题,最近两个月,小编回答了无数遍,但是,我的答案从来没有变过:你不做小程序,你的竞争对手一定会去做,到底要不要做,各位老板可以看完下面的文章思考一下。
微盛企微管家
2020/07/23
5480
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
PC互联网时代的商业模式是通过入口级产品获取用户,把控网络流量,最后通过流量变现来赢利。
速成应用小程序开发平台
2018/07/19
5010
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
PC互联网时代的商业模式是通过入口级产品获取用户,把控网络流量,最后通过流量变现来赢利。
场景录小程序
2018/07/27
4080
微信小程序凭什么能成为企业、商家流量变现竞争新宠?
小程序做电商的六大优势,看了你就知道为什么必须做小程序了
最近小程序甚是火爆,许多电商朋友都坐不住了,也想加入进来。但是这几个关于小程序却在心里:
中微信通
2018/11/05
2.1K0
农产品微信小程序利用电商模式营销实现在线交易才是展的突破口
农产品类小程序无需太过花哨的设计,简洁美观即可,功能图标设计偏向于棕色,给用户营造出泥土、大自然、淳朴的感觉,凸显自然、健康的农产品特性。
速成应用小程序开发平台
2018/08/26
8770
小程序数据分析报告:公测一周年,为你揭秘变现的9亿流量红利
作者 咫尺网络 本文转自网络,如涉侵权请及时联系我们 根据小程序近期卓越的市场表现,创业者可能要重新思考小程序的真正价值。 在小程序公测一周年之际,咫尺网络发布了一份《小程序变现能力及消费用户洞察数据报告》。报告显示,小程序经过将近一年的时间发展,变现能力已经凸显,其中零售电商和餐饮行业两大领域的小程序月流水环比增长在8月时均已超过60%。此外从报告中还可以看出,小程序已经基本渗透到微信活跃用户人群中,用户使用习惯逐渐形成,小程序用户数量预计在Q4阶段可增长至2亿。 小程序真的没有流量红利吗?
CDA数据分析师
2018/02/26
1.3K0
小程序数据分析报告:公测一周年,为你揭秘变现的9亿流量红利
一篇文章告诉你,为什么小程序能够火的一塌糊涂!
据微信官方数据显示,目前小程序已有超过3亿用户,简直火的一塌糊涂,小程序未来可能带来的颠覆还会更多,作为一个服务工具连接各行各业,真正实现互联网时代,不论是传统行业还是已经进入互联网大军的企业都正在逐
用户1745481
2018/04/27
7200
一篇文章告诉你,为什么小程序能够火的一塌糊涂!
小程序+公众号玩出新花样?有趣skr了
微信也是一张流量温床,奈何转化能力一般,而小程序的出现结合小程序一起,从公众号呈现内容,到引流吸粉,再到转化成交,很大程度上帮助了商家解决了高成本问题。
微盛企微管家
2018/09/17
1.2K0
小程序+公众号玩出新花样?有趣skr了
KTV微信小程序能够解决KTV行业哪些痛点
1、时段性明显,营业额差异被拉开,顾客集中在节假日,或者是晚上,预约难、排队久的问题难以解决;
速成应用微信小程序开发平台
2018/06/02
1.4K0
微信小程序电商平台,商家非做不可?
  近日,微信在支付页面开放“智慧零售”入口引发关注。继福州地区之后,深圳地区的用户同样可以通过微信客户端的“我-支付-腾讯服务-智慧零售”访问腾讯智慧零售小程序。这意味着,腾讯智慧零售小程序正逐步从小范围测试,慢慢变为全国开放,给商家们增加了一大流量入口。
木鱼小铺小程序1
2020/03/31
1.9K0
微信小程序电商平台,商家非做不可?
行业 | 农产品+小程序,让销量提升的奥秘!
天然农产品以其远离城市无污染,无公害受到不少城市居民的欢迎,农产品进城也就有了一个良好的开端。微信小程序经过发展,已经渗透到人们的日常生活,越来越多的人衣食住行都离不开小程序。面对小程序发展正猛的势头,不少商家们都设计了专属的小程序,来顺应时代的潮流。
极客小程序分享
2019/02/19
1.3K0
行业 | 农产品+小程序,让销量提升的奥秘!
电商小程序7分钟破百万?看了这篇文章你就懂了
网络变化的世界风起云涌,自小程序出来之后,有不少老顾客都抱着迟迟观望的态度,虽然跃跃欲试但又有不少顾虑,其中我收到最多的问题就是如上图:小程序该如何引流? 小程序自带流量 小程序自动覆盖五公里的的功能让它和其他宣传手段甚至他一母同胞的公众号兄弟本质区别开来:其他的宣传手段均为被动宣传,需要人为的去吸引流量,而小程序则是主动出击。店铺根据距离来排名,与品牌大小无关,也就是说,用户离你越近,你就排得越前。 小程序“以客带客” 立足小程序强大的社交基本属性,利用有效的社交运营模式实行“以客拉客
用户1745481
2018/07/05
4400
开发商城小程序有什么好处
众所周知,目前的移动互联网端都在小程序市场的笼罩之下,百度的工具类智能小程序,支付宝的支付类和金融类小程序,微信的社交类、电商类小程序等,每一个小程序平台都有其独特的特点,都在其各自擅长的领域发挥着自
用户1745481
2019/01/08
1.3K0
小程序 + 政务,可以碰出怎样的火花
  刘特鑫  微信高级产品经理  小程序自今年一月份发布以来,不断开放接口能力,丰富连接场景。不同行业在小程序开发上的应用创新也可谓是多种多样。 在政务服务领域,小程序也以其便捷、迅速、功能强大而获得青睐,以外交部、工商总局、农业部为代表的部委级的单位开发的政务服务小程序,更是独领风潮。 下面就结合小程序发布三个多月来的一些发展,来谈谈我对小程序在政务领域应用的一些思考。 一、从科斯定律说起,为什么要做小程序? 到底小程序是什么?什么样的场景更适合小程序?最近在听薛兆丰的北大经济课,里面讲的
腾讯研究院
2018/02/06
1.9K0
小程序 + 政务,可以碰出怎样的火花
产业安全专家谈 | 银行业小程序安全防护的实践路径
当前,随着网络业务与移动业务的兴起,银行业已经进入智能化、数字化的新时代。网上银行、移动客户端、小程序相继成为各个银行实现数字化转型的重要载体。
腾讯安全
2020/06/01
7330
产业安全专家谈 | 银行业小程序安全防护的实践路径
金融小程序风险如何控制,WeTest小程序质量专项方案一步到位
导语 自2017年微信小程序推出以来,便凭借其开放、便捷的产品特点实现了用户的高速增长。伴随着近年来金融业数字化转型的推进与移动网络业务的兴起,如今,小程序已成为银行、保险、证券交易等金融场景服务用户的重要载体之一。 小程序在金融领域的应用: 1,快捷便利,降低用户办理相关业务的门槛; 2,打通线上线下服务场景,构建场景闭环; 3,提升线下服务效率,线上助力新客获取; 4,整合流量入口,构建金融生态体系。 由于金融类业务自身的高敏感性、交易性,与移动设备的复杂性、安全风险等原因,使得行业与用户对金融类
WeTest质量开放平台团队
2022/01/07
4430
福州速成应用微信小程序:为KTV酒吧行业带来一轮新的福音
简介:通过附近的小程序定位引流,KTV小程序将吸引大批新潮的用户。用户不需要下载注册,微信即可在线预定包厢,商家的服务效率大大提高,降低服务成本。商家通过优惠促销活动微信分享优惠等功能,吸引更多潜在用户。
速成应用微信小程序开发平台
2018/06/02
9280
推荐阅读
相关推荐
​小程序商城的火爆该如何把握2019年小程序创业方向
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.简单查询:
    • 应用实例:
  • 2.关联查询:
    • 1.直接使用
    • 2.使用with()
    • 3.使用joinWith()
    • 4.joinWith与with的区别
  • 3.常用案例
    • findOne()和findAll():
    • where()条件:
    • [[and]]:将不同的条件组合在一起,用法举例:
    • [[or]]:
    • [[not]]:
    • [[between]]: not between 用法相同
    • [[in]]: not in 用法类似
    • [[like]]:
    • [[exists]]: not exists用法类似
    • 常用查询:
    • 更新:
    • 删除:
    • 批量插入:
    • 事务:
    • 查看执行 sql
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档