https://github.com/daijunooo/orm_tp3.2
最近开发用的lyadmin框架是基于tp3的,用惯了模型关联,tp3对模型关联支持不够好,为了提高开发效率,自己实现了模型关联功能。
如何使用
//用户表模型
class User extends Model
{
use ModelTrait;
public function one()
{
return $this->find();
}
}
注意 User 类里面不要有 ModelTrait 中同名方法,如果有请改名。
控制器里面调用 User 模型方法 one
class Index extends Controller
{
public function index()
{
$user = User::_one();
return $user;
}
public function getUserById($id)
{
$user = User::_find($id);
return $user;
}
}
提示:如果 User 模型中有 before_one 方法,那么调用 one 方法前会先调用 before_one。增加了 before 和 after 的生命周期,方便对方法调用前后做一些业务处理。
使用模型关联
//用户表模型
class User extends Model
{
use ModelTrait;
//一个用户可以购买多个商品,商品表的id和用户表的goods_id关联
public function goods()
{
return $this->hasMany(Goods::class, 'id', 'goods_id');
}
}
//商品表模型
class Goods extends Model
{
use ModelTrait;
//一个商品只属于一个用户,用户表的id和商品表的user_id关联
public function user()
{
return $this->hasOne(User::class, 'id', 'user_id');
}
}
class Index extends Controller
{
public function myGoods()
{
$user = User::_one();
return $user->goods()->autoData();
}
public function getUserInfo($goods_id)
{
$goods = Goods::_find($goods_id);
return $goods->user()->data();
}
}
自动完成
//用户表模型
class User extends Model
{
use ModelTrait;
public function getSexAttr()
{
$this->sex = $this->sex == 1 ? '男' : '女';
}
//一个用户可以购买多个商品,商品表的id和用户表的goods_id关联
public function goods()
{
return $this->hasMany(Goods::class, 'id', 'goods_id');
}
}
class Index extends Controller
{
public function getUserInfo($goods_id)
{
$goods = Goods::_find($goods_id);
//调用autoData会自动调用 get字段名Attr的方法,以方便将字段值转换成前台需要的值
return $goods->user()->autoData();
}
}
User 模型里面有 getSexAttr 方法,所以会自动将性别转换为男或女。
- 更多用法请看源码,此模型关联查询不会太消耗性能,所有关联查询只会查一次,后面每次都是从缓存中取。