关联

关联

[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的数据
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容