笔记

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

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值