程序员小助手|ORM 模型用法纲要,3分钟短文:Laravel

引言
前两期为了说明laravel框架提供的数据库操作能力 , 直接使用DB门面操作 , 而没有引入更为强大的eloquentorm功能 。 从本期开始 , 我们就分次把eloquent的一些简要知识点 , 为大家提炼演示一下 。 主要以代码为主 , 配以简要说明 。
程序员小助手|ORM 模型用法纲要,3分钟短文:Laravel
文章图片
学习时间
【程序员小助手|ORM 模型用法纲要,3分钟短文:Laravel】Eloquent其实是一个ActiveRecord类型的ORM 。 这是一个位于数据库操作之上的一个中间层 , 不仅仅是对于整张表的操作 , 更能细化到每行记录的增删改查 。
创建一个模型类非常简单 , 只用继承系统的模型就可以了:
useIlluminateDatabaseEloquentModel;classContactextendsModel{}
因为遵循的是约定大于配置的惯例 , 所以上述模型如不指定表名 , 默认就是默认数据库的contacts表了 。
对于数据库插入新条目 , 则可以便捷地使用模型的方法执行 , 比如下面这样:
publicfunctionsave(Request$request){$contact=newContact();$contact->first_name=$request->input('first_name');$contact->last_name=$request->input('last_name');$conatct->email=$request->input('email');$contact->save();returnredirect('contacts');}
创建一个合约 , 并使用传入的表单数据填充 。 接着是使用模型对数据的查询:
publicfunctionshow($contactId){returnContact::findOrFail($contactId);}
这里有一个语法糖 , 就是findOrFail , 如果找到就返回一个模型 , 找不到就返回默认错误页面 。 上述方法会对Contact模型调用toArray方法进行格式化 , 然后返回一个JsonResponse对象的响应体 。
如果返回的模型想要手动定制一下 , 那么在查询结果集中 , 使用Collection提供的格式化功能就好了 。
publicfunctionvips(){returnContact::where('vip',true)->get()->map(function($contact){$contact->formalName=''Theexalted{$contact->first_name}ofthe{$contact->last_name}s'';return$contact;});}
大家注意 , get方法返回的是一个EloquentCollection , 包含了Model模型的集合 。 所以使用map遍历集合元素时 , 每个元素其实都是一个独立的Contact对象 , 直接给对象追加属性就可以增加字段了 。
创建模型
除了上面我们使用手动创建模型文件之外 , laravel还为我们提供了命令行方式快捷创建 。 使用下面的指令:
phpartisanmake:modelContact
这样会在App命名空间下生成一个标准的模型文件Contact.php , 内容如下:
namespaceApp;useIlluminateDatabaseEloquentModel;classContactextendsModel{//}
如果数据库表还没有创建 , 你想要把迁移文件的骨架代码也生成出来 , 只需在生成指令上追加参数如下:
phpartisanmake:modelContact--migration
有些时候 , 我们维护一些数据库和表 , 想要动态切换某个模型所对应的数据库表 , 那么只需在模型文件内手动指定表名即可:
protected$table='contacts_secondary';
如果你使用的主键不是id , 是自定义的字段名 , 那也可以手动指定:
protected$primaryKey='contact_id';
这个contact_id是系统维护 , 而非自增的 , 你需要显式声明不要自增这个字段:
public$incrementing=false;
如果创建的表内有created_at,updated_at等等标准字段 , 而在数据库表的字段默认值内允许为NULL , 或者默认为NULL 。 你想要他们自动更新为当前系统时间 , 只需要添加这个配置项:
public$timestamps=false;
存储的日期时间格式 , 也可以自定义:
protected$dateFormat='YmdHis';