关联模型 (1对1)

关联模型 (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()

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
        // 开启自动写入时间戳
        protected $autoWriteTimestamp = true;
        // 定义自动完成的属性
        protected $insert = [‘status‘ => 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模型

<?php
namespace app\index\model;
use think\Model;
class Profile extends Model
{
        protected $type = [
        ‘birthday‘ => ‘timestamp:Y-m-d‘,
        ];
}

 ?>

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

模型中并不需要定义关联方法。

如果你需要基于Profile 模型来进行关联操作,则需要在Profile 模型中定义对应的BELONGS_TO 关

联,如下:

<?php
namespace app\index\model;
use think\Model;
class Profile extends Model
{
    protected $type = [
    ‘birthday‘ => ‘timestamp:Y-m-d‘,
    ];
    public function user()
    {
    // 档案 BELONGS TO 关联用户
    return $this->belongsTo(‘User‘);
    }
}

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

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

1. 关联新增


<?php
namespace app\index\controller;
use app\index\model\Profile;
use app\index\model\User as UserModel;
class User
{
// 关联新增数据
    public function add()
    {
        $user = new UserModel;
        $user->name = ‘thinkphp‘;
        $user->password = ‘123456‘;
        $user->nickname = ‘流年‘;
        if ($user->save()) {
        // 写入关联数据
        $profile = new Profile;
        $profile->truename = ‘刘晨‘;
        $profile->birthday = ‘1977-03-05‘;
        $profile->address = ‘中国上海‘;
        $profile->email = ‘[email protected]‘;
        $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 对象,例如:

<?php
namespace app\index\controller;
use app\index\model\Profile;
use app\index\model\User as UserModel;
class User extends Controller
{
// 关联新增数据
public function add()
{
        $user = new UserModel;
        $user->name = ‘thinkphp‘;
        $user->password = ‘123456‘;
        $user->nickname = ‘流年‘;
        if ($user->save()) {
        // 写入关联数据
        $profile[‘truename‘] = ‘刘晨‘;
        $profile[‘birthday‘] = ‘1977-03-05‘;
        $profile[‘address‘] = ‘中国上海‘;
        $profile[‘email‘] = ‘[email protected]‘;
        $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 . ‘<br/>‘;
 echo $user->nickname . ‘<br/>‘;
 echo $user->profile->truename . ‘<br/>‘;
 echo $user->profile->email . ‘<br/>‘;
}

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

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

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

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

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

    3.关联更新

    一对一的关联更新如下:

    public function update($id)
    {
    $user = UserModel::get($id);
    $user->name = ‘framework‘;
    if ($user->save()) {
    // 更新关联数据
    $user->profile->email = ‘[email protected]‘;
    $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

时间: 2024-10-10 10:31:09

关联模型 (1对1)的相关文章

thinkphp 关联模型配置代码

<?php /** * 公司与部门关联模型 */ class CompanyRelationModel extends RelationModel{ //主表名称 protected $tableName = 'company'; //定义关联关系 protected $_link = array( //关联表名称 'department' => array( 'mapping_type' => MANY_TO_MANY, //多对多关系 'foreign_key' => 'com

thinkphp关联模型的用法

HAS_ONE(值得注意的是,这是主动关联,外键必须是被关联的表): 1 <?php 2 namespace Home\Model; 3 use Think\Model\RelationModel; 4 class TagModel extends RelationModel{ 5 protected $_link =array( 6 'artag'=>array(//关联的数据表 7 'mapping_type'=>self::HAS_ONE,//一对一 8 'class_name'

ThinkPHP 3.2.3 关联模型的使用

关于关联模型 ThinkPHP 3.2.3 的关联模型(手册地址)一般处理关联数据表的 CURD 操作,例如关联读取.关联写入.关联删除等. 实例 博客管理模块关于博客有 4 张数据表:博客表 crm_blog: CREATE TABLE `crm_blog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL DEFAULT '', `content` text NOT NULL, `tim

ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为,一条评论 id 对应一篇文章,为 ONE_TO_ONE 关系 ( 一对一 ).评论表的结构为: 其中 aid 字段与文章表的 id 字段对应.打开自定义模型 ArticleModel,让模型继承于 RelationModel,然后定义成员属性 $_link,代码: ArticleModel.cla

【ThinkPHP】关于ThinkPHP关联模型和视图模型的一些心得

视图模型更加类似一张表虚拟的表,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成.对其中所引用的基础表来说,视图的作用类似于筛选,这是ThinkPHP手册上的说法 其实说白了,视图模型就是mysql多表查询而已,视图模型不支持多表更新,删除 而关联模型是多个表查询以后的结果组合,会多次查询mysql,(在执行完主表查询以后,会有个_after_select)之类的操作,然后组合结果集.在一些情

ThinkPHP 关联模型(二十)

原文:ThinkPHP 关联模型(二十) ThinkPHP关联模型 两表关联查询:Message 和  user  关联条件uid(参考手册:模型->关联模型) 步骤: 一:创建Message表自定义的Mode  --->Home\Lib\Model\MessageModel.class.php <?php class MessageModel extends RelationModel{ //这是自动填充 protected $_auto=array( array('time','ti

thinkphp 多对多关联模型(转)

先建立一个模型 1 2 3 4 5 6 7 8 9 10 11 12 <?php  class UserModel extends RelationModel{      protected $_link=array(        "group"=>array(            "mapping_type"=>MANY_TO_MANY,            "foreign_key"=>"uid&quo

thinkphp 3.2中依靠关联模型来关联三个表

这里说的是用thinkphp3.2关联模型关联三个表 根据用户表查询出三个表的数据,需要两个model来配合,第一个model是根据user表来查询到班级的信息,然后第二个model是根绝banji中的信息去查询年级中的信息 还有一个模型也可以做到这种效果,就是视图模型

ThinkPHP 关联模型中查询某条记录的父级(非查询子级)

数据表 id      cat_name      cat_pid 76     手机.数码     0 84     手机配件        76 86     蓝牙耳机        84 从属关系 : 蓝牙耳机  =>(上一级)  手机配件   =>(上一级)  手机.数码(顶级了) 关联模型 namespace Admin\Model; use Think\Model\RelationModel; class CategoryModel extends RelationModel {

关联模型[1]

一. 模型简介关联模型,一共有三种模式.一对一:ONE_TO_ONE,包括 HAS_ONE 和 BELONGS_TO:一对多:ONE_TO_MANY,包括 HAS_MANY 和 BELONGS_TO:多对多:MANY_TO_MANY.          用表关系来理解这三种模式:一对一:用户表和身份证表,一个用户只能对应一个身份证,而一个身份证只能对应一          个用户.这就是一对一.一对多:用户表和留言表:一个用户可以发表 N 条留言,而每条留言只能由某一个用户          发