摘要:模型資料庫遷移儲存紀錄在及之間建立關聯在及之間建立關聯取得紀錄取得取得一對多關聯示例細節在此示例中,我們有兩個模型小偷和車,和兩張表和。業務規則小偷可以偷走多輛車。關系圖關聯詳情關聯表應該保存駕駛員和汽車。
一張 Laravel’s Eloquent ORM 5.5 的速查表一對一關聯 展示細節:
在這個展示中,我們有 2 個模型(Owner 和 Car)及兩張表(owners 和 cars)。
商業邏輯:一個使用者可以擁有一臺車。
一臺車可以有一個擁有者。
Cars 表必須儲存 Owner ID。
Eloquent 模型:class Owner { public function car() { return $this->hasOne(Car::class); } } class Car { public function owner() { return $this->belongsTo(Owner::class); } }資料庫遷移:
Schema::create("owners", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("cars", function (Blueprint $table) { $table->increments("id"); $table->string("name"); $table->integer("owner_id")->unsigned()->index()->nullable(); $table->foreign("owner_id")->references("id")->on("owners"); });儲存紀錄:
// 在 Owner 及 Car 之間建立關聯 $owner->car()->save($car); // 在 Car 及 Owner 之間建立關聯 $car->owner()->associate($owner)->save();取得紀錄:
// 取得 Owner Car $owner->car; // 取得 Car Owner $car->owner;
在此示例中,我們有兩個模型:Thief (小偷)?和?Car (車),和兩張表:
thieves?和?cars 。
小偷可以偷走多輛車。
車只能被一個小偷偷走。
車輛表應該存儲小偷的 ID 。
Eloquent 模型:class Thief { public function cars() { return $this->hasMany(Car::class); } } class Car { public function thief() { return $this->belongsTo(Thief::class); } }數據遷移:
Schema::create("thieves", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("cars", function (Blueprint $table) { $table->increments("id"); $table->string("name"); $table->integer("thief_id")->unsigned()->index()->nullable(); $table->foreign("thief_id")->references("id")->on("thieves"); });記錄存儲:
// 創建介于小偷與車之間的關聯。 $thief->cars()->saveMany([ $car1, $car2, ]); // 或者在單一模型調用 save() 方法。 $thief->cars()->save($car); // 創建介于 Car 和 Thief 的關聯。 $car->thief()->associate($thief)->save();拉取記錄:
// 獲取小偷所偷的車 $thief->cars; // 獲取偷盜某輛車的小偷 $car->thief;
在這個演示中,我們有三個模型(Man, Woman 和 Car),和三張表(man, women 和 cars)。
業務規則:一個男人(買家)可以買很多汽車。
一個女人(買家)可以買很多汽車。
這個汽車可以被一個買家購買(男人或女人)。
Car表應該儲存買家 ID?和買家類型。
"buyer" 是一組模型名稱 (男人 和 女人), 它不僅限于兩者,buyer 類型是模型的真實名稱 。
class Man { public function cars() { return $this->morphMany(Car::class, "buyer"); } } class Woman { public function cars() { return $this->morphMany(Car::class, "buyer"); } } class Car { public function buyer() { return $this->morphTo(); } }數據庫遷移:
Schema::create("men", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("women", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("cars", function (Blueprint $table) { $table->increments("id"); $table->string("name"); $table->integer("buyer_id")->unsigned()->index()->nullable(); $table->string("buyer_type")->nullable(); // 或者使用 $table->morphs(‘buyer’); 代替 "buyer_id" 和 "buyer_type" });儲存記錄:
// 在買家 (男人 / 女人) 和汽車之間建立聯系。 $man->cars()->saveMany([ $car1, $car2, ]); $woman->cars()->saveMany([ $car1, $car2, ]); // 或者為單個模型使用 save() 函數。 $man->cars()->save($car); $woman->cars()->save($car); //創建汽車與買家之間的關系 ( 男人/女人 )。 $car1->buyer()->associate($man)->save(); $car2->buyer()->associate($woman)->save();檢索記錄:
// 獲取買家 (男人 / 女人)的汽車 $men->cars $women->cars // 獲取這輛車的買家 (男人 / 女人) $car->buyer
在這個示例中,我們有兩個模型(Driver 和 Car),和三張表
(drivers,名為?car_driver的中間關聯表).
一個司機可以駕駛很多輛車。
一輛車可以被很多個司機開。
關聯表"car_driver"應該保存駕駛員ID和汽車ID。
關聯模型:class Driver { public function cars() { return $this->belongsToMany(Car::class); } } class Car { public function drivers() { return $this->belongsToMany(Driver::class); } }數據庫遷移:
Schema::create("drivers", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("cars", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("car_driver", function (Blueprint $table) { $table->increments("id"); $table->integer("car_id")->unsigned()->index(); $table->foreign("car_id")->references("id")->on("cars")->onDelete("cascade"); $table->integer("driver_id")->unsigned()->index(); $table->foreign("driver_id")->references("id")->on("drivers")->onDelete("cascade"); });保存記錄:
//創建Driver和Car之間的關聯。 $driver->cars()->attach([ $car1->id, $car2->id, ]); //或者使用sync()函數防止重復關聯。 $driver->cars()->sync([ $car1->id, $car2->id, ]); //創建Car和Driver之間的關聯。 $car->drivers()->attach([ $driver1->id, $driver2->id, ]); //或者使用sync()函數防止重復關聯。 $car->drivers()->sync([ $driver1->id, $driver2->id, ]);查詢記錄:
// Get Driver Car $driver->cars // Get Car Drivers $car->drivers
在這個展示中我們有三個模型(Valet、Owner 及 Car)和 4 張表(valets、owners、cars 及 drivers)。
商業邏輯:一個代駕(司機)可以駕駛很多輛車
一個車主(司機)可以駕駛很多輛車
一臺車可以被很多個司機駕駛(代駕和 / 或車主)
中間表「drivers」應該儲存駕駛人 ID、駕駛人類型及車輛 ID。
駕駛是一個模型集合的代稱(Valet 及 Owner),而且不限定兩個模型。駕駛人類型是模型的真正名稱。
class Valet { public function cars() { return $this->morphToMany(Car::class, "driver"); } } class Owner { public function cars() { return $this->morphToMany(Car::class, "driver"); } } class Car { public function valets() { return $this->morphedByMany(Valet::class, "driver"); } public function owners() { return $this->morphedByMany(Owner::class, "driver"); } }資料庫遷移:
Schema::create("valets", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("owners", function (Blueprint $table) { $table->increments("id"); $table->string("name"); }); Schema::create("drivers", function (Blueprint $table) { $table->increments("id"); $table->integer("driver_id")->unsigned()->index(); $table->string("driver_type"); // 或使用 $table->morphs(‘driver’) 來取代「driver_id」和「driver_type」 $table->integer("car_id")->unsigned()->index(); $table->foreign("car_id")->references("id")->on("cars")->onDelete("cascade"); });儲存紀錄:
// 在 driver(Valet / Owner)和 Car 間建立關聯 $valet->cars()->saveMany([$car1, $car2]); $owner->cars()->saveMany([$car1, $car2]); // 或使用 save() 方法來儲存單一模型 $valet->cars()->save($car1); $owner->cars()->save($car1); // 在 Car 和 driver(Valet / Owner)間建立關聯 $car->valets()->attach([ $valet1->id, $valet2->id, ]); $car->owners()->attach([ $owner1->id, $owner2->id, ]); // 或是用 sync() 方法來避免重複關聯 $car->valets()->sync([ $valet1->id, $valet2->id, ]); $car->owners()->sync([ $owner1->id, $owner2->id, ]);取得紀錄:
// 取得 driver(Valet / Owner)的 Cars $valet->cars $owner->cars // 取得 Car 的 drivers(Valet 及 Owner) $car->owners $car->valets
更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29263.html
摘要:關聯關系查詢在中,所有的關系都是使用函數定義的,可以在不執行關聯查詢的情況下獲取關聯的實例。 關聯關系 One To One 假設User模型關聯了Phone模型,要定義這樣一個關聯,需要在User模型中定義一個phone方法,該方法返回一個hasOne方法定義的關聯
摘要:使用時,數據庫查詢構造器的方法對模型類也是也用的,使用上只是省略了表名部分。在模型中使用成員變量指定綁定的表名。 使用Eloquent [el?kw?nt] 時,數據庫查詢構造器的方法對模型類也是也用的,使用上只是省略了DB::table(表名)部分。 在模型中使用protected成員變量$table指定綁定的表名。
摘要:使用全局作用域功能可以為模型的所有操作增加約束。提供了一些方法可以方便的來實現數據類型之間的轉換。要定義一個,需要在模型中創建一個名稱為的方法,其中的是駝峰命名法的字段名。 查詢作用域 全局作用域 全局作用域允許你對給定模型的所有查詢添加約束。使用全局作用域功能可以為模型的所有操作增加約束。 軟刪除功能實際上就是利用了全局作用域功能 實現一個全局作用域功能只需要定義一個實現Illumi...
showImg(http://ww2.sinaimg.cn/large/005SFY0kjw1f2mt468a0cj31bs10mtk8.jpg); GitHub 項目在此: https://github.com/Aufree/laravel5-cheat... 本項目由 @Aufree 和 @Summer 整理維護。 說明 最近在開始使用 Laravel 進行開發, 在學習過程中無意間發現了 L...
摘要:是什么是一個,全稱為,翻譯為對象關系映射如果只把它當成數組庫抽象層那就太小看它了。所謂對象,就是本文所說的模型對象關系映射,即為模型間關系。至此,深入理解系列文章到此結束。 原文發表在我的個人網站:深入理解 Laravel Eloquent(三)——模型間關系(關聯) 在本篇文章中,我將跟大家一起學習 Eloquent 中最復雜也是最難理解的部分——模型間關系。官方英文文檔中...
閱讀 662·2021-11-23 09:51
閱讀 3610·2021-11-15 11:38
閱讀 943·2021-10-14 09:42
閱讀 3182·2021-09-29 09:35
閱讀 2123·2021-09-03 10:33
閱讀 778·2021-07-30 16:33
閱讀 1568·2019-08-30 15:55
閱讀 1853·2019-08-30 14:04