博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关联模型 (1对1)
阅读量:5462 次
发布时间:2019-06-15

本文共 4206 字,大约阅读时间需要 14 分钟。

关联模型 (1对1)

ThinkPHP5.0 的关联采用了对象化的操作模式,你无需继承不同的模型类

只是把关联定义成一个方法,并且直接通过当前模型对象的属性名获取定义的关联数据。

关联定义:一个user有一份profile

DROP TABLE IF EXISTS `think_user`;CREATE TABLE IF NOT EXISTS `think_user` (`id` int(6) UNSIGNED NOT NULL AUTO_INCREMENT,`nickname` varchar(25) NOT NULL,`name` varchar(25) NOT NULL,`password` varchar(50) NOT NULL,`create_time` int(11) UNSIGNED NOT NULL,`update_time` int(11) UNSIGNED NOT NULL,`status` tinyint(1) DEFAULT 0,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `think_profile`;CREATE TABLE IF NOT EXISTS `think_profile` (`id` int(6) UNSIGNED NOT NULL AUTO_INCREMENT,`truename` varchar(25) NOT NULL,`birthday` int(11) NOT NULL,`address` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`user_id` int(6) UNSIGNED NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

hasOne (一个用户有一份档案)

步骤一、定义用户模型,并在用户模型中定义关联方法profile()

1]; // 定义关联方法 public function profile() { // 用户HAS ONE档案关联 return $this->hasOne('Profile'); }}

很关键的是在关联的方法中调用 hasOne方法()

hasOne方法有5个参数,依次分别是:

hasOne('关联模型名','关联外键','主键','别名定义','join类型')

  1. 关联那个模型
  2. 关联表中的哪个字段是本模型的主键(也就是关联本模型的键是那个)
  3. 本模型的主键是那个
  4. 数据别名定义使用数组
  5. 默认是inner

注意点:

  • 通常关联模型和当前模型都是相同的命名空间,如果关联模型在不同的命名空间,需要指定完整的类名,例如:
// 关联admin模块下面的模型对象return $this->hasOne('\app\admin\Profile');
  • 在关联查询的时候,默认使用当前模型的名称(小写)作为数据表别名,可以指定查询使用的数据表别名,例如:
// 用户HAS ONE档案关联return $this->hasOne('Profile','user_id','id',['user'=>'member','profile'=>'info']);
  • 要进行模型的关联操作,我们必须同时定义好关联模型

步骤二、定义Profile模型

'timestamp:Y-m-d', ];} ?>

可以看到Profile 模型中并没有定义关联方法。如果你的关联操作都是基于User 模型的话, Profile

模型中并不需要定义关联方法。
如果你需要基于Profile 模型来进行关联操作,则需要在Profile 模型中定义对应的BELONGS_TO 关
联,如下:

'timestamp:Y-m-d', ]; public function user() { // 档案 BELONGS TO 关联用户 return $this->belongsTo('User'); }}

belongsTo 方法和hasOne 一样,也有5个参数:

belongsTo('关联模型名','关联外键','关联模型主键','别名定义','join类型')

1. 关联新增

name = 'thinkphp'; $user->password = '123456'; $user->nickname = '流年'; if ($user->save()) { // 写入关联数据 $profile = new Profile; $profile->truename = '刘晨'; $profile->birthday = '1977-03-05'; $profile->address = '中国上海'; $profile->email = 'thinkphp@qq.com'; $user->profile()->save($profile); return '用户新增成功'; } else { return $user->getError(); } }}
  1. $profile = new Profile;
  2. $user->profile()->save($profile);

关联模型的写入调用了关联方法profile() ,该方法返回的是一个Relation 对象,执行save 方法会自动传入当前模型User 的主键作为关联键值,所以不需要手动传入Profile 模型的user_id 属性。save 方法也可以直接使用数组而不是Profile 对象,例如:

name = 'thinkphp'; $user->password = '123456'; $user->nickname = '流年'; if ($user->save()) { // 写入关联数据 $profile['truename'] = '刘晨'; $profile['birthday'] = '1977-03-05'; $profile['address'] = '中国上海'; $profile['email'] = 'thinkphp@qq.com'; $user->profile()->save($profile); return '用户[ ' . $user->name . ' ]新增成功'; } else { return $user->getError(); }}}

*$user->profile()->save($profile);

2.关联查询

一对一的关联查询很简单,直接把关联对象当成属性来用即可,例如:

public function read($id){ $user = UserModel::get($id); echo $user->name . '
'; echo $user->nickname . '
'; echo $user->profile->truename . '
'; echo $user->profile->email . '
';}

以上关联查询的时候,只有在获取关联对象($user->profile)的时候才会进行实际的关联查询,缺点

是会可能进行多次查询,但可以使用预载入查询来提高查询性能,对于一对一关联来说只需要进行一次查询即可获取关联对象数据,例如:

public function read($id){$user = UserModel::get($id,'profile');echo $user->name . '
';echo $user->nickname . '
';echo $user->profile->truename . '
';echo $user->profile->email . '
';}

get方法使用第二个参数就表示进行关联预载入查询。

  • $user = UserModel::get($id,'profile');

    3.关联更新

    一对一的关联更新如下:
public function update($id){    $user = UserModel::get($id);    $user->name = 'framework';    if ($user->save()) {    // 更新关联数据    $user->profile->email = 'liu21st@gmail.com';    $user->profile->save();    return '用户[ ' . $user->name . ' ]更新成功';    } else {    return $user->getError();    }}

4. 关联删除

关联删除代码如下:

public function delete($id){    $user = UserModel::get($id);    if ($user->delete()) {    // 删除关联数据    $user->profile->delete();    return '用户[ ' . $user->name . ' ]删除成功';    } else {    return $user->getError();    }}

转载于:https://www.cnblogs.com/oneboi/p/8266813.html

你可能感兴趣的文章
集成通用Mapper
查看>>
SQL单表查询
查看>>
无服务器端的UDP群聊功能剖析 文章索引
查看>>
android studio 新建项目导入到Coding远程仓库git
查看>>
Pandas选择数据
查看>>
poj2411铺砖——状压DP
查看>>
python3 不知文件编码情况下打开文件代码记录
查看>>
打开eclipse出现JVM terminated.Exit Code=-1错误的解决办法
查看>>
SSH连接时出现Host key verification failed的原因及解决方法【转载】
查看>>
2017.6.7
查看>>
7. 炒股怎么看盘
查看>>
【采集层】Kafka 与 Flume 如何选择(转)
查看>>
【BZOJ1803】Spoj1487 Query on a tree III 主席树+DFS序
查看>>
jQuery 遍历 - map() 方法
查看>>
jQuery事件绑定、解绑、命名空间
查看>>
C#类,对象,构造方法
查看>>
学习笔记: AOP面向切面编程和C#多种实现
查看>>
学习笔记: 特性Attribute详解,应用封装
查看>>
java的垃圾回收方法finalize()
查看>>
Android NDK构建资料
查看>>