TP5中CURD那點事兒(六)

weixin_34365417發表於2018-05-07
多對多模型  
背景:快遞配送區域shipping_area  地區region  + 一張關係表,
    一個配送區域對應多個城市地區,
    比如:一線城市這個配送區域 ——> 北上廣深 ; 還有東三省、珠三角、江浙滬、偏遠地區等...

    一個地區也有可能對應多個配送區域,
    比如:北京 ——> (首都、一線城市)

    region.php 區域模型中
        return $this -> belongsToMany('ShipingArea','tp_area_region','id1','id2');
    ShipingArea.php 配送區域模型中建立同樣方法
    注意:兩個關聯id的順序為關聯表中的順序

新增/更新
    1、向一個表插資料,會觸發關聯表同時完成
        $region = Region::getByName('北京市');
        $region -> ShipingArea() ->save(['shiping_area_name' => '中國首都']);
    如上:
        shipping_area表中增加一條記錄中國首都,此時關係表中增加一條關聯記錄

    2、給當前使用者加多個角色
        $user = User::getById(30);
        $user -> role() -> saveAll([
                    ['role_name' => '角色1'],
                    ['role_name' => '角色2'],
                    ['role_name' => '角色3'],
                ]);

    3、給一個地區新增一個現有的配送區域,實則在關聯表新增一條關聯記錄
        $region = Region::get(355);//現有地區
        $ShipingArea = ShipingArea::getByShipingAreaName('珠三角'); //現有配送區域
        呼叫attach()
        $region -> shipingArea()->attach($ShipingArea);//這裡可以直接傳珠三角的id

刪除關聯
    $region = Region::getByName('北京市'); //返回北京
    $ShipingArea = ShipingArea::get(2); //返回首都
    $region -> shipingArea()->detach($ShipingArea);// 只刪除關係表關聯記錄
    $region -> shipingArea()->detach($ShipingArea,true);// 刪除關聯記錄同時刪除shipingArea中對應的記錄(首都)

查詢
    $region::get(2014,'shipingArea'); //這裡傳的方法名,查詢的是多表

    $region::get(2014); //不傳第二引數可執行以下操作
    $region ->shipingArea[0]-> 欄位名


Model層中讀取器
    protected function getUserStatusAttr($value,$data)
    {
        $status = [ -1 => '刪除', 0 => '禁用' , 1 => '正常', 2 => '待稽核'];
        return $status[$data['status']];
    }

模型輸出資料庫中沒有的欄位
Controller層

    使用toArray方法將當前的模型例項輸出為陣列
    陣列輸出的欄位值會經過獲取器的處理,也可以支援追加其它獲取器定義(不在資料表欄位列表中)的欄位
    $user -> append(['user_status']) ->toArray();

    $user = User::find(1);
    $user ->toArray();//將當前的模型例項輸出為陣列
    $user ->hidden(['reg_time','last_time'])->toArray(); //設定不輸出的欄位屬性
    $user ->visible(['user_id','nickname','email'])->toArray() //設定允許輸出的屬性
    呼叫模型的toJson方法進行JSON序列化
    $user ->toJson();

相關文章