关联

作者: Maiiiiiiiiiiiid | 来源:发表于2019-04-28 12:48 被阅读0次

关联

[TOC]


一对多

关联

在User的model中创建关联Comment的model:

    public function comm(){
        return $this->hasMany('comment','uid','id');   //model model的字段 本model的字段
    }

在控制器中使用关联(属性/方法)

读取
        $user = User::get(1);
        //属性 //是一个comment对象数组
//        print_r($user->comm);
//        foreach($user->comm as $comm){
//            echo $comm['content'];
//        }
        //方法  返回一个Relation的model(HasMany类)   
        $sel = $user->comm()->where('content','不知道')->select();
        echo $sel;

$user->comm()->find()$comm = $user->comm()->getByContent('不知道')返回Comment类

$user->comm()$user->comm()->where('content','哈哈哈')返回HasMany类(Relation)

$user->comm()->where('content','哈哈哈')->select()返回数组

$user->comm 返回comment对象数组

查询id为1的user表的同时查询uid为1的comment表

$user = User::get(1,'comm');         //返回User类

返回的User model如下:

{
    "id": 1,
    "name": "用户名",
    "email": "157465655@163.com",
    "birthday": 1998,
    "comm": [
        {
            "content": "哈哈哈",
            "uid": 1
        },
        {
            "content": "可还行",
            "uid": 1
        },
        {
            "content": "不知道",
            "uid": 1
        },
        {
            "content": "不知道",
            "uid": 1
        },
        {
            "content": "哈哈哈",
            "uid": 1
        }
    ]
}

除此之外,还有model的静态方法has(聚合查询):

$user = User::has('comm')->select();//如果有评论就将数组赋给$user   relation
//带条件的
$user = User::has('comm','>=',2)->select();//如果有大于等于2条评论就将数组赋给$user  relation op count
//hasWhere
$user = User::hasWhere('comm',['content'=>'哈哈哈'])->select();

执行这个方法之后的sql日志:

[ sql ] [ SQL ] SELECT `User`.* FROM `user` `User` INNER JOIN `comment` `Comment` ON `User`.`id`=`Comment`.`uid` GROUP BY `Comment`.`uid` HAVING count(*)>=1 [ RunTime:0.001734s ]

[ sql ] [ SQL ] SELECT `User`.* FROM `user` `User` INNER JOIN `comment` `Comment` ON `User`.`id`=`Comment`.`uid` GROUP BY `Comment`.`uid` HAVING count(*)>=2 [ RunTime:0.000704s ]

[ sql ] [ SQL ] SELECT `User`.* FROM `user` `User` INNER JOIN `comment` `Comment` ON `User`.`id`=`Comment`.`uid` WHERE  `Comment`.`content` = '哈哈哈' GROUP BY `User`.`id` [ RunTime:0.002099s ]
写入

因为getByContent()返回的时Comment类所以写入可以直接使用getByContent('字段1')->字段2=值的方式设置

使用User::get(1,'comm')返回的User类也可以使用where()->update([‘字段’=>值])设置

删除等操作以此类推

一对一

users model对应car model

    public function car(){
        return $this->hasOne('car','uid','id');             //model  model关联字段   本model字段
    }

由于是一对一 $user->car是一个car对象

照样 $user->car()是一个HasOne对象(Relation)

同理 $user->car()->find()是一个car对象

设置car
$c = $user->car()->find();
$c->brand = "zhp";
$c->save();
新增user和car:
$user = new User;
$user->name = 'maidd';
$user->email = '155@163.com';
$user->birthday = '2019/01/01';
if($user->save()){
$car['brand'] = '奔驰';           
$car['plate_number'] = 1124576;
$user->car()->save($car);          //设置car         car的uid自动生成
return 'nb';
}else{
return $user->getError();
}

删除同理。

多对多

原理:

数据库中存在三张表:需要对应的两张表和一张中间表(只有两个字段(分别是前两个表的关联id),建议将其命名为model名+‘_id’,字段存入的值时那两个model的主键(id)的值)

对应的model里有两个关联的Shippingarea和Region model

首先关联model:

Shippingarea model里

public function region(){
    return $this->belongsToMany('Region','area_region','shipping_id','region_id'); //model 带前缀的数据表 中间表的字段1 字段2(顺序不要换)当后面两个参数为空时,会以model名+‘_id’来传入
}

同理Region model里:

public function shippingarea(){
    return $this->belongsToMany('Shippingarea','area_region','shipping_id','region_id'); //model 带前缀的数据表 中间表的字段1 字段2(顺序不要换)当后面两个参数为空时,会以model名+‘_id’来传入 
}
新增关联

然后在控制器里面操作:

$region = Region::getByName('北京');
$region->shippingarea()->save(['name'=> '中国首都']);
新增多个关联
$region = Region::get(1);
$region->shippingarea()->saveAll([
    ['name'=> '中国首都'],
    ['name' => '全国一线城市'],
]);
关联两个已经存在的数据
$region = Region::get(2);
$shipping = Shippingarea::get(2);
$region->shippingarea()->attach($shipping);   //反过来也可以
删除两个已经存在的数据的关联
$region = Region::get(2);
$shipping = Shippingarea::get(2);
$region->shippingarea()->detach($shipping,true);//true表示删除中间表数据的同时删除$shipping的数据

相关文章

  • 关联 不关联

    烟雨朦胧里 横生而发的一缕思绪 是否停驻在朦胧斑驳的一处 询问 那一日 这一日的光景 你可曾望见 世俗里 有顽固的...

  • Runtime 关联对象, 可在分类中添加属性

    Runtime 关联对象, 可在分类中添加属性 关联 API 如下 设置关联值 获取关联值 取消关联 关联策略

  • iOS~关联类型、关联值、关联对象

    1、Associated Type (关联类型) Practical Protocols with Associa...

  • 关联的关联472

    刚刚读到一个观点,关联是进步的天梯。于是我忍不住也想通过这个观点再向外关联思考。关联,如果是自己所理解的那样的话,...

  • 设计模式中常见的关系举例

    设计模式就是面向对象的一种数据结构 关联关系 关联可以是双向关联、单向关联,其中单向关联还可以包含一种特殊的关联就...

  • SQL Server 2016 表操作:多表关联查询

    INNER JOIN 交叉关联 LEFT JOIN 左关联 RIGHT JOIN 右关联

  • 关联

    有的人 走着走着就丢了 有的人无论多远 都丢不了 就像在大海游泳 身边的水 总是连着远处的水 如同河流,流过你和我...

  • 关联

    一个是伫立在塞纳河畔的巴黎铁塔, 一个是横跨海河的万国桥(解放桥), 两者相隔万水千山, 它们之间...

  • 关联

    沙漠,风,沙波涟漪 岁月,时光,额上皱纹

  • 关联

    几个学习的链接地址 ibm_umlcsdn_blog 关联是什么

网友评论

      本文标题:关联

      本文链接:https://www.haomeiwen.com/subject/kjjdnqtx.html