where()方法中|和&的用法

//快捷查询
Db::table('think_user')
->where('name|title','like','thinkphp%')
->where('create_time&update_time','>',0)
->find();
//sql:
SELECT * FROM `think_user` 
WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) 
AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

whereOr()方法用法

->whereOr([//第一维代表多个条件
    [//第二维之间用or链接
        //第三维之间用and连接
        ['create_time', '<=', time()],
        ['status', '=', '1']
    ],[
        ['id', '>=', 10],
        ['update_time', '>=', time()],
    ]
])
//拼凑出来的结果:
//where (create_time <= time() and status = 1) 
//or  (update_time >= time() and id >= 10)

belongsToMany(多对多)修改的使用

适用于多对多,并且有中间表的,例如,不同用户关联不同的兴趣标签,关联数据单独存在一个表中:

建表:

  • article表(字段:id,……)

  • label表(字段:id,name,……)

  • article_label表(字段:id,article_id,label_id,createtime,……)

article模型中:

//方法名随意,调用时使用此方法名
public function Labels(){
    //参数1:关联模型
    //参数2:中间表表名,不带表前缀
    //参数3:中间表 关联 关联模型的外键
    //参数4:中间表 关联 当前模型的外键
    return $this->belongsToMany('LabelModel', 'article_label','label_id','article_id');
}

控制器中使用:

//查询
$data=ArticleModel::with('Labels')->select();
//使用,因为查询结果为对象,所以调用方式如下:
//打印第一条文章数据下第一个标签的名字
dump($data[0]->Labels[0]->name);
//接口调用:直接用json_encode()处理后自动变成三维数组
echo json_encode($data);
//删除
$data = ArticleModel::find(1);//查询文章信息
$data->Labels()->detach();//删除article_label表中当前文章的信息
//添加
$label_ids=[1,2,3,4,5,6,7,8,9];//需要绑定的label表主键id
//参数1是需要绑定的多个label_id,参数2是其他需要补充的字段
$data->Labels()->attach($label_ids,['createtime'=> time()]);//保存

hasMany(一对多)的使用

多表一对多的使用

一般用于一条记录对应多条记录,例如某个文章的评论:

建表:

  • article表(字段:id,……)

  • comment表(字段:id,article_id,content,……)

article模型中:

//方法名字随意,调用时方法名作为参数使用
public function comments(){
    //参数1:关联模型名
    //参数2:关联模型外键
    //参数3:当前模型表主键
    return $this->hasMany('CommentModel','article_id','id');
}

控制器中使用:

$data=ArticleModel::with('comments')->select();
//使用,因为查询结果为对象,所以调用方式如下:
//打印第一条文章数据下第一条评论数据的内容
dump($data[0]->comments[0]->content);
//接口调用:直接用json_encode()处理后自动变成三维数组
echo json_encode($data);

单表一对多的使用

一般用于多级分类存在同一个表中:

建表:

  • classify表(字段:id,name,level,pid,……)

classify模型中:

//方法名字随意,调用时方法名作为参数使用
public function secondClassify(){
    //参数1:当前模型名
    //参数2:上级id(原关联模型外键)
    //参数3:当前模型表主键
    return $this->hasMany('ClassifyModel','pid','id');
}

控制器中使用:

//查询一级分类,自动补全二级
$data=ClassifyModel::with('secondClassify')->where('level',1)->select();
//使用,因为查询结果为对象,所以调用方式如下:
//打印第一条一级分类数据下第一个二级分类的名称
dump($data[0]->secondClassify[0]->name);
//接口调用:直接用json_encode()处理后自动变成三维数组
echo json_encode($data);

hasOne(一对一)的使用

一般用于主记录查询子记录(子表有关联记录在主表),例如一个用户信息只对应一个用户:

建表:

  • user表(字段:id,message_id,……)

  • message表(字段:id,user_id,……)

user模型中:

//方法名字随意,调用时方法名作为参数使用
public function user(){
    //参数1:关联模型名
    //参数2:关联模型外键
    //参数3:当前模型主键
    return $this->hasOne('UserModel','message_id','id');
}

控制器中使用:

$data=UserModel::with('user')->select();
//使用,因为查询结果为对象,所以调用方式如下:
//打印当前用户信息对应的用户生日
dump($data[0]->user->birthday);
//接口调用:直接用json_encode()处理后自动变成三维数组
echo json_encode($data);

belongsTo(一对一)的使用

一般用于主记录查询子记录(子表有一条记录属于主表),例如一个用户只有一条用户信息:

建表:

  • user表(字段:id,message_id,……)

  • message表(字段:id,user_id,……)

classify模型中:

//方法名字随意,调用时方法名作为参数使用
public function messages(){
    //参数1:关联模型名
    //参数2:关联模型外键
    //参数3:当前模型主键
    return $this->belongsTo('MessageModel','message_id','id');
}

控制器中使用:

$data=UserModel::with('messages')->select();
//使用,因为查询结果为对象,所以调用方式如下:
//打印第一条用户数据下子信息的金额
dump($data[0]->messages->money);
//接口调用:直接用json_encode()处理后自动变成三维数组
echo json_encode($data);

连贯操作column方法

//取单列:获取所有标签名,输出结构:[id=>name]
LabelModel::column('name','id');
//取多列:获取所有标签名和创建时间,输出结构:[id=>[id,name,createtime]]
LabelModel::where('status',1)->column('name,createtime','id');

连贯操作cache()的使用

cache()可以用于select、find、value和column方法,以及其衍生方法,使用cache方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据,关于数据缓存的类型和设置可以参考缓存部分。

1. 简单的存储

//查询news表中id=10的新闻存储于cache中
//写true默认读取配置的中缓存时间
db('news')->cache(true)->find(10);
//你也可以自定义时间,60秒表示:
db('news')->cache(true,60)->find(10);

2. 指定缓存标识

//等同于使用缓存时的键,默认读取配置的中缓存时间:
db('news')->cache('key')->find(15);
//全局读取这条数据:
$data = \think\Cahce::get('key');

3.支持设置缓存标签:

//缓存键:key,缓存时间:60秒,标签为:tagName
db('news')->cache('key',60,'tagName')->find(15);
//全局读取带标签的缓存:
Db::name('news')->cache('news_list',60,'shx')->select();
$data = \think\Cache::tag('shx')->get('news_list');