7-8
一些Db操作数据库
$result = Db::query('select * from banner where id=?',[1]);
$result = Db::table('banner')->where('id','=',$id)->select();
$result = Db::table('banner')->where(function($query) use ($id){
$query->where('id','=',$id);
})->select();
7-9节
模型继承Model后就可以直接使用get方法查询 而不需要自己写getBannerById(),可以在配置文件中配置输出格式 大概是34行
7-10节
每个模型名字最好对应数据库的表名 这样就可以相对应了 如果要把模型手动映射到某个表 可以使用:
protected $table = 表名
模型可以对应一个表 复杂的也可以对应多个表
tp5 可以使用Terminal 快速创建模型
>php think make:model api/BannerItem
要在根目录下指向命令,api代表的是模块。
7-11节
模型对应数据库的表
模型对象 对应数据库一条记录
静态方法(推荐)
$banner = Banner::get($id)
实例化模型来调用
$banner = (new Banner())->get($id)
7-12
查询
find select get all
前两者Db特有,后两者模型特有 如果使用get all 方法则不能使用Db查询。(Db是模型的基石)
模型 和数据库访问层(DB)的4个原则
模型主要处理业务DB就是用来操作数据库
不要因为模型的性能稍差而不使用模型
要用面向对象思维设计模型
模型的底层是数据库访问抽象层,可以自动调用数据库访问抽象层
8-1
A表和B表是1对多 那么在B中有很多重复的数据。
8-2
关联查询步骤(比如说是A表关联B)
首先在A模型中增加items函数(函数名自己定义)(hasMany里面三个参数,分别是关联模型的模型名,关联模型与之相关联的字段名,当前模型的主键)
一对多
public function items()
{
return $this->hanMany('BModel','A_id','id')
}
一对一
public function items()
{
return $this->belongsTo('BModel','A_id','id')
}
$banner = AModel::with(items)->find($id)
8-3
A关联B B又嵌套关联C
在B模型中写
public function img()
{
return $this->hanMany('CModel','C_id','id')
}
$banner = AModel::with(['items','items.img'])->find($id)
A关联B 关联C
在A模型中写
public function img()
{
return $this->hanMany('CModel','C_id','id')
}
再
$banner = AModel::with(['items','img'])->find($id)
8-4
业务层在模型编写,然后在控制器调用模型中的方法。
好处是:模型中有许多内置的方法 下面列举几个。
把查出的json数据 隐藏其中的某些数据(下面演示隐藏id和name)
$banner = $banner->hidden(['id','name']);
只显示查出的某些数据
$banner = $banner->visible(['id','name'])
8-5
上述8-4中的隐藏显示方法仍然存在不足,比如说某个字段可能在很多接口都需要隐藏,那么你就需要在很多控制器去重复代码,其实我们完全可以避免这种情况,直接在模型中去 增加属性就可以。列如:
隐藏
protected $hidden = ['id','name'];
显示
protected $visible = ['id','name'];
8-6
在application目录下新建extra目录再在extra下建立配置文件,tp默认是可以自动加载的。列如:
新建 set.php文件
<?php
return [
'pre_url' => 'your host'
];
怎么取出配置?
config('set.pre_url')
静态资源放在public目录下 才有权限访问。
8-7
读取器,可以在模型中读取某个字段的值,处理后返回,读取器的方法名是确定的get.字段名.Attr,里面传入的
value表示读取的字段值,
data表示一行的值。
列如:当form字段=1时,在url字段前加上配置好的域名再返回。
public function getUrlAttr($value,$data)
{
$Url = $value;
if($data['form'] == 1)
{ $Url = config('set.pre_url').$value
}
return $url
8-8
思考一
上面8-7的问题 ,要是有很多表都有Url字段,那么如果我们是在每个有url字段的模型都定义这个读取器 代码就比较杂乱了
`改进:可以新增一个继承于model的basemodel,再让其他所有的业务model继承basemodel,把读取器放在basemodel中即可。
思考二:要是按照上面把读取器定义在了basemodel中 那么有些字段的url不需要这样处理 怎么办?
改进:可以把读取器嵌套在basemodel的一个方法里,然后再在需要处理的业务model层调用该方法,这样就只有在调用的时候才会识别读取器了
8-9
开闭原则:尽可能稍等 去修改之前的代码,因为新的代码测试成本高
支持多版本 路由上表示控制器的的V1别写死
改成:Rount::get(':v/url,:v/url');
8-10
`