一對一:
如:人和身份證的關系。
即A表的一條數據,對應B表的一條數據;B表的一條數據,對應A表的一條數據。
model類操作:
需要在你要管理/操作的那個model內,加上關系
例如:
業務需求:查某人信息,同時關聯查詢出他的身份證信息。
人 表 user:id,name,codeid(此列對應身份證表id)
身份證表 code:id,codenum
首先,在user的model里加入:
class User extends Model { //usercode名字是自定義的,不受限制,盡量以開頭小寫的駝峰式命名法 public function usercode() { //第一個參數:關聯的表名(關聯誰?) //第二個參數:user表的外鍵(關聯誰的啥?) //第三個參數:對應的code表的主鍵(我用啥去關聯這個?) //后兩個參數可以省略,不建議 return $this->hasMany("code","id","codeid"); } }
其次,在user的controller類里,使用的時候如下:
//以插入為列子: $list = $this->request->param(); //先添加user表數據 $u=new User(); $u->allowField(true)->save($list); //同時添加身份證信息,一對一關聯 (user的實例內已經有了save后的id) $u->usercode()->save();
查詢時加入->with("自定義方法名"),如->with("usercode")
一對多:
如:班級和學生的關系
一個班級有多個學生,一個學生只屬於一個班級
例如:
業務需求:查某學生信息,同時關聯查詢該學生所屬班級。
班級表 class:id,name(這里不考慮class保留字段的問題)
學生表 students:id,name,classid(此列對應班級id)
首先,在學生的model里加入:
class Students extends Model {
public function getclass()
{ //第一個參數:關聯的表名(關聯誰?) //第二個參數:class表的主鍵(關聯誰的啥?) //第三個參數:對應的學生表的外鍵(我用啥去關聯這個?) //后兩個參數可以省略,不建議 return $this->hasMany("Class","id","classid");
}
}
其次,在students的controller類里,使用的時候如下:
$list = (new Students())->where("條件什么的")->with("getclass")->select();
其他情況,如多對一,可以轉化為一對多
如果有多對多的情況,可以建立,也必須建立中間表,從而轉化為一對多+多對一的問題。
最后:官方文檔寫的實在太簡略了,不利於推廣使用
