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