多對多模型
背景:快遞配送區域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();