3分钟短文:说说Laravel模型中还算常用的2个“关系”
引言
上一章我们介绍了比较简单的laravel模型关联关系中的一对一,介绍了关联操作方法。
太难的概念理解起来都费劲,更不用说写代码了,所以对于太难的那些关联关系,
且不论其效率如何,我们都不先做介绍。
本期说一说2个比较常用的关联模型。
belongsTo 关系
正好像对于一个词语,找到对应的反义词,或者说有一个图片,找到其镜像图片这样的。
有作用力,就有反作用力。一对一关系模型中,A有一个B,则反过来,B属于一个A。
这就是首先要介绍的 belongsTo 关系。
在模型Profile中添加对应到User模型的关系:
class Profile extends Model {
public function user()
{
return $this->belongsTo('AppUser');
}
}
也就是说,有一个profile是从属于user的,这与User模型的hasOne正好是对应关系。
在代码中使用该关联关系:
$email = Profile::where('id', 3)->first()->user->email;
其中first方法返回一个Profile模型对象实例,在Profile类中我们声明了 user() 方法用于关系用户模型,
所以此处链式调用 user 属性,返回的是一个 AppUser 对象实例,其包含 User 模型的所有属性,
因此 email 属性也相应返回数据库内的字段值。
一对多关系
还有一个常见的关联关系是一对多。比如一个用户有多个手机号,一种状态包含很多个事件,一个商品有多个标签等等等等,
这都是一对多的常见用法。
我们使用State模型状态有多个Event事件这个场景,演示一下一对多关系的声明,以及应用。在命令行创建模型文件,同时创建迁移文件:
php artisan make:model State --migration
默认在 AppState.php 文件内生成下面的代码:
use IlluminateDatabaseEloquentModel;
class State extends Model {}
我们还是先去生成数据库表的迁移文件,手动实现迁移字段:
public function up()
{
Schema::create('states', function(Blueprint $table)
{
$table->increments('id');
$table->string('name');
$table->string('abbreviation');
$table->timestamps();
});
}
以及撤回迁移时删除表:
public function down()
{
Schema::drop('states');
}
接着在命令行执行迁移指令:
php artisan migrate
执行成功,数据库表states就创建成功了。
我们说关联关系需要外键,所以需要手动在events表内追加一个字段 state_id,用于指向刚才创建的表states的id字段。
执行命令行,创建迁移文件:
php artisan make:migration add_state_id_to_events_table --table=events
手动实现迁移文件的修改:
public function up()
{
Schema::table('events', function (Blueprint $table) {
$table->integer('state_id')->unsigned()->nullable();
$table->foreign('state_id')->references('id')->on('states');
});
}
以及回滚迁移时手动删除追加的字段:
public function down()
{
Schema::table('events', function (Blueprint $table) {
$table->dropForeign('events_state_id_foreign');
$table->dropColumn('state_id');
});
}
基础数据准备完毕,下面在模型内添加关联关系:
class State extends Model {
public function events() {
return $this->hasMany('AppEvent');
}
}
非常直观,一种状态,有若干个事件。反过来,一个事件,一定属于某种状态,那就是belongsTo关系。
class Event extends Model {
public function state()
{
return $this->belongsTo('AppState');
}
}
代码层面也准备好了,下面可以开始使用了。比如创建事件时,手动为其指定状态:
$event = new Event;
$event->name = "Laravel Hacking and Pizza";
$event->state_id = 41;
$event->save();
注意,hasMany关联关系,返回的是多个模型的集合,可以后续链式调用集合的所有方法。
写在最后
本文不失简单地介绍了belongsTo和hasMany两个关联关系,这在代码中仅次于hasOne关系,
使用的频次比较高的。而效率也就是根据外键多查询一次SQL的消耗而已。但是明白其中原理之后,
在代码内耗时的操作里,也绝不可滥用关联关系,否则会严重消耗性能。
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
- 谷歌「机弦」有何玄机?
- 01字典树贪心查询+建立+删除(个人模版)
- 优先队列(个人模版)
- Numpy教程第2部分 - 数据分析的重要功能
- 最小表示法(个人模版)
- 基于Python-ChatterBot搭建不同adapter的聊天机器人(使用NB进行场景分类)
- 并查集(个人模版)
- Markdown 语法和 MWeb 写作使用说明既然都整理了,捎带手把这个也整理了吧第一级标题<h1>
- 带权并查集(个人模版)
- 我的第一次Pascal程序
- Hive第二天学习内容总结Hive 第三天DDL特别注意一下,没事别删除数据DML
- Codeforces 791B Bear and Friendship Condition(DFS,有向图)
- Codeforces 791A Bear and Big Brother(暴力枚举,模拟)
- Selenium2+python自动化28-table定位
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Rust FFI 编程 - Rust导出共享库04
- 使用结构化的标头字段改善HTTP
- c语言直接读写ini配置文件
- Rust FFI 编程 - Rust导出共享库03
- 【crossbeam系列】2 crossbeam-epoch:基于epoch的无锁“垃圾收集”
- java调用JNI总结
- 【Rust日报】2020-07-30 fixed_vec减少Rust数组冗余边界检查
- 我的小工具,用C和python实现远程读卡器,远程读写消费卡片
- c语言实现TCP的socket通信
- 多文件目录Makefile的写法
- 一个有趣的例子带你入门canvas
- GitLab 12 跨版本 13 升级
- 【Rust日报】2020-07-28 SO:在命令行下浏览StackOverflow
- 【翻译】200行代码讲透RUST FUTURES (6)
- MPU6050姿态解算方式1-DMP