模型关联(主从表 banner banner_item)
界面上有多个banner位 每个banner位置具体显示图片个数 banner_item
查询banner 获取当前banner位信息以及具体banner_item信息
banner->banner_item 1->many
定义关联
class Banner extends Model
{
public function items() {
//当前banner有多个banner_item 通过banner_item外键banner_id与banner的主键id 相关联
return $this->hasMany('BannerItem','banner_id','id') ;
}
}
查询关联
//链式方法with('已经定义的关联方法名') 表示当前模型查询时需要关联 一个已定义的关联
$banner = BannerModel::with('items')->find($id) ;
------------------
sql日志打印信息
[运行时间:0.075166s] [吞吐率:13.30req/s] [内存消耗:4,111.25kb] [文件加载:48]
[ sql ] [ DB ] CONNECT:[ UseTime:0.000743s ] mysql:host=127.0.0.1;port=3306;dbname=zerg;charset=utf8
[ sql ] [ SQL ] SHOW COLUMNS FROM `banner` [ RunTime:0.005334s ]
[ sql ] [ SQL ] SELECT * FROM `banner` WHERE `id` = 1 LIMIT 1 [ RunTime:0.001314s ]
[ sql ] [ SQL ] SHOW COLUMNS FROM `banner_item` [ RunTime:0.001654s ]
[ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE `banner_id` = 1 [ RunTime:0.000748s ]
嵌套关联
1>主表有多张从表
定义关联 banner表与banner_item X 都有关联
class Banner extends Model
{
public function items() {
//当前banner有多个banner_item 通过banner_item外键banner_id与banner的主键id 相关联
return $this->hasMany('BannerItem','banner_id','id') ;
}
public function items1() {
//对应关系 视情况而定
return $this->hasMany('X','外键','主键') ;
}
}
查询关联
//with()接收数组
$banner = BannerModel::with(['items','items1'])->find($id) ;
2>banner与banner_item 1->many banner_item与img belongsTo
定义关联
class Banner extends Model
{
public function items() {
return $this->hasMany('BannerItem','banner_id','id') ;
}
}
class BannerItem extends Model
{
public function img() {
return $this->belongsTo('Image','img_id','id') ;
}
}
查询关联
$banner = BannerModel::with(['items','items.img'])->find($id) ;
---------------
log
[运行时间:0.060316s] [吞吐率:16.58req/s] [内存消耗:4,288.93kb] [文件加载:51]
[ sql ] [ DB ] CONNECT:[ UseTime:0.000421s ] mysql:host=127.0.0.1;port=3306;dbname=zerg;charset=utf8
[ sql ] [ SQL ] SHOW COLUMNS FROM `banner` [ RunTime:0.000815s ]
[ sql ] [ SQL ] SELECT * FROM `banner` WHERE `id` = 1 LIMIT 1 [ RunTime:0.000395s ]
[ sql ] [ SQL ] SHOW COLUMNS FROM `banner_item` [ RunTime:0.000885s ]
[ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE `banner_id` = 1 [ RunTime:0.000360s ]
[ sql ] [ SQL ] SELECT * FROM `banner_item` WHERE `banner_id` = 1 [ RunTime:0.000465s ]
[ sql ] [ SQL ] SHOW COLUMNS FROM `image` [ RunTime:0.004347s ]
[ sql ] [ SQL ] SELECT * FROM `image` WHERE `id` IN (65,2,3,1) [ RunTime:0.002276s ]
优化:
在controller层
$banner = BannerModel::with(['items','items.img'])->find($id) ;
可读性没有BannerModel::getBannerByID()好 暴露了查询细节
此处在 model封装一层方法 在controller层调用
class Banner extends Model
{
public function items() {
return $this->hasMany('BannerItem','banner_id','id') ;
}
public static function getBannerByID($id)
{
$banner = self::with(['items','items.img'])->find($id) ;
return $banner ;
}
}
class Banner
{
/**
* 接口说明 获取指定id的banner信息
* @url /banner/:id
* @http GET
* @id banner的id号
*/
public function getBanner($id)
{
(new IDMustBePostiveInt())->goCheck() ;
$banner = BannerModel::getBannerByID($id) ;
if(!$banner) {
throw new BannerMissException() ;
}
return $banner ;
}
隐藏模型字段
(安全性 有些字段不宜返回客户端)
(返回的json结构简洁)
$banner = BannerModel::getBannerByID($id) ;返回了模型所有字段
但是如id delete_id 等一些无意义字段不需要返回
1>将 $banner对象转换成数组
$data = $banner->toArray() ;
unset($data['delete_time']) ;
unset($data['update_time']) ;
2>使用对象方法
hidden()需要隐藏的字段
$banner->hidden(['delete_time','update_time','items.delete_time','items.update_time','items.img.delete_time','items.img.update_time'] ) ;
visible()需要显示的字段
$banner->visible(['id','name','description','items.img_id','items.key_word','items.img.url']) ;
3>在模型内部隐藏字段
Model类自带属性 protected $hidden=[] ; protected visible=[] ;
class Banner extends Model
{
//设置隐藏字段
protected $hidden = ['delete_time','update_time'] ;
//设置显示字段
protected $visible = [] ;
public function items() {
return $this->hasMany('BannerItem','banner_id','id') ;
}
public static function getBannerByID($id)
{
$banner = self::with(['items','items.img'])->find($id) ;
return $banner ;
}
}