关联

作者: 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的数据
    

    相关文章

      网友评论

          本文标题:关联

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