黑马lavarel教程---10、lavarel模型关联
黑馬lavarel教程---10、lavarel模型關聯
一、總結
一句話總結:
1、模型關聯比較方便,一次定義,后面都可以使用
2、關聯關系 使用動態屬性進行調用
?
1、一對多,多對多實例?
一對多:一篇文章有多個評論
多對多:一個文章可能有多個關鍵詞,一個關鍵詞可能被多個文章使用。
?
2、lavarel模型關聯中關聯代碼是寫在主模型中還是寫在次模型中?
關聯代碼寫在主模型中
誰是主模型誰是次模型根據實際需求進行分析,比如文章表和關鍵詞表多對多關系,當要查所有文章對應的關鍵詞的時候文章表就是主模型
?
3、lavarel關聯關系的方法名稱一般是什么?
被關聯的模型名小寫
public function 被關聯的模型名小寫(){return $this -> hasOne(‘需要關聯模型的命名空間’,’被關聯模型的關系字段,’本模型中的關系字段’); }?
4、lavarel模型中如何設置一對多模型中的外鍵字段?
return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
?
5、關聯關系的使用方法?
使用動態屬性進行調用:$roles = App\User::find(1)->roles()->orderBy('name')->get();
<?phpnamespace App; use Illuminate\Database\Eloquent\Model; class User extends Model {/*** 用戶的角色*/public function roles(){return $this->belongsToMany('App\Role');} } 一旦關聯關系被定義后,你可以通過 roles 動態屬性獲取用戶角色:$user = App\User::find(1);foreach ($user->roles as $role) {// } 當然,像其它所有關聯模型一樣,你可以使用 roles 方法,利用鏈式調用對查詢語句添加約束條件:$roles = App\User::find(1)->roles()->orderBy('name')->get();?
?
?
?
二、lavarel模型關聯
關聯模型就是綁定模型(表)的關系(關聯表),后續需要使用聯表的時候就可以直接使用關聯模型。注意:關聯模型必須要創建模型。
1、一對一關系
例如:一篇文章只有一個作者
?
①創建模型【前提】
#php artisan make:model Home/Article
#php artisan make:model Home/Author
?
?
?
?
②定義基本的結構代碼
?
?
?
?
?
?
?
③關聯模型的關聯方法(重點)
注意:在寫關聯模型的時候要分析出是誰關聯誰,誰做主動關聯的模型?當前的案例是文章關聯作者,需要關聯代碼寫在主模型中。
語法:
???????? public function 被關聯的模型名小寫(){
?????????????????? return $this -> hasOne(‘需要關聯模型的命名空間’,’被關聯模型的關系字段,’本模型中的關系字段’);
}
?
?
?
?
?
關聯關系的使用方法:使用動態屬性進行調用
?
?
?
?
案例:通過關聯模型的一對一關系查詢出每個文章對應的作者名稱
①定義需要的路由
?
?
?
?
②創建需要的方法
?
?
?
?
使用一對一關聯關系之后,其可以替代之前寫join聯表操作。
?
2、一對多關系
例如:一篇文章有多個評論
?
由于文章和評論的關系是一對多的關系,所以需要再去創建一個數據表(評論表):
字段id???????????????????????? 主鍵
字段comment???????????? 評論內容
字段article_id???????????? 和文章的關系字段,文章id
①遷移文件的創建
#php artisan make:migration create_comment_table
?
?
?
?
②編寫遷移文件代碼
?
?
?
?
③執行遷移文件生成數據表
#php artisan migrate
?
?
?
?
④添加測試的評論內容
a. 創建填充器文件
#php artisan make:seeder CommentTableSeeder
?
?
?
?
b. 編寫填充器文件的代碼
?
?
?
?
c. 執行填充器文件
#php artisan db:seed --class=CommentTableSeeder
?
?
?
?
⑤評論模型創建起來
#php artisan make:model Home/Comment
?
?
?
?
定義其基本的屬性:
?
?
?
?
案例:查詢出每個文章(主)下所有的評論(從)。
關聯關系的編寫:
?
public function 被關聯的模型名小寫(){
?????????????????? return $this -> hasMany(‘需要關聯模型的命名空間’,’被關聯模型的關系字段,’本模型中的關系字段’);
}
?
與hasOne方法相比,其只是把方法名稱做了變化,其他與之前一致。
?
?
?
?
?
?
編寫test22方法實現上述案例的要求:
操作代碼:
?
?
?
效果:
?
?
?
?
?
?
3、多對多關系
例如:一個文章可能有多個關鍵詞,一個關鍵詞可能被多個文章使用。
?
?
?
當點開關鍵詞鏈接之后,會發現一個關鍵下能搜出很多文章。
?
因此,文章和關鍵詞之間是多對多的關系。
?
對對多的關系經過拆分之后其實就是兩個一對多的關系。由于是雙向一對多的關系,因此光靠2張表是無法建立的關系的,需要依靠第三張表建立關系(xx與xx的關系表)。
?
當前已經存在文章表,因此還需要關鍵詞表和關系表。
?
關鍵詞表:
???????? 字段id??????????????????????? 主鍵
???????? 字段keyword?????????? 關鍵詞
?
文章與關鍵詞的關系表:
???????? 字段id??????????????????????? 主鍵
???????? 字段article_id???????? 文章id
???????? 字段key_id?????????????? 關鍵詞id
?
簡易模擬:
Id????? 關鍵詞????????????????????????????????????????? id????? 文章id???? 關鍵詞id
1?????? 芳華?????????????????????????????????????????????? 1?????? 1??????????????? 1
2?????? 馮小剛????????????????????????????????????????? 2?????? 1??????????????? 2
???????????????????????????????????????????????????????????????? 3?????? 2??????????????? 1
?
①創建需要遷移文件
#php artisan make:migration create_keyword_table
#php artisan make:migration create_relation_table
?
?
?
②編寫遷移文件的代碼
?
?
?
?
?
?
?
?
③執行遷移文件生成數據表
#php artisan migrate
?
?
?
?
④生成測試的數據
#php artisan make:seeder KeywordAndRelationTableSeeder
?
?
?
?
編寫相關代碼:
?
?
?
?
執行填充器文件:
#php artisan db:seed --class=KeywordAndRelationTableSeeder
?
?
?
?
⑤創建需要的模型
注意:根據手冊中記錄的語法要求,不需要給關系表單獨的創建模型。
該處只需要單獨給keyword創建模型即可
?
#php artisan make:model Home/Keyword
?
?
?
?
定義模型的基本內部結構
?
?
?
?
案例:查詢出每個文章下全部的關鍵詞
?
?
?
語法:return $this -> belongsToMany(被關聯模型的元素空間路徑,多對多模型的關系表名,當前模型中的關系鍵,被關聯模型的關系鍵);
?
根據案例的要求,此處的關系映射依舊寫在文章模型中
?
?
?
?
編寫test23方法,實現剛才案例的需要:
?
?
?
顯示效果:
?
?
?
?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/11579725.html
總結
以上是生活随笔為你收集整理的黑马lavarel教程---10、lavarel模型关联的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: legend3---lavarel安装d
- 下一篇: 黑马lavarel教程---5、模型操作