成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Laravel Eloquent 模型關(guān)聯(lián)速查表

flybywind / 2910人閱讀

摘要:模型資料庫遷移儲(chǔ)存紀(jì)錄在及之間建立關(guān)聯(lián)在及之間建立關(guān)聯(lián)取得紀(jì)錄取得取得一對(duì)多關(guān)聯(lián)示例細(xì)節(jié)在此示例中,我們有兩個(gè)模型小偷和車,和兩張表和。業(yè)務(wù)規(guī)則小偷可以偷走多輛車。關(guān)系圖關(guān)聯(lián)詳情關(guān)聯(lián)表應(yīng)該保存駕駛員和汽車。

一張 Laravel’s Eloquent ORM 5.5 的速查表
一對(duì)一關(guān)聯(lián) 展示細(xì)節(jié):

在這個(gè)展示中,我們有 2 個(gè)模型(Owner 和 Car)及兩張表(owners 和 cars)。

商業(yè)邏輯:

一個(gè)使用者可以擁有一臺(tái)車。
一臺(tái)車可以有一個(gè)擁有者。

關(guān)聯(lián)圖:

關(guān)聯(lián)細(xì)節(jié):

Cars 表必須儲(chǔ)存 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");
});
儲(chǔ)存紀(jì)錄:
// 在 Owner 及 Car 之間建立關(guān)聯(lián)
$owner->car()->save($car);
// 在 Car 及 Owner 之間建立關(guān)聯(lián)
$car->owner()->associate($owner)->save();
取得紀(jì)錄:
// 取得 Owner Car
$owner->car;
// 取得 Car Owner
$car->owner;

一對(duì)多關(guān)聯(lián) 示例細(xì)節(jié):

在此示例中,我們有兩個(gè)模型:Thief (小偷)?和?Car (車),和兩張表:
thieves?和?cars 。

業(yè)務(wù)規(guī)則:

小偷可以偷走多輛車。
車只能被一個(gè)小偷偷走。

關(guān)系圖:

關(guān)系細(xì)節(jié):

車輛表應(yīng)該存儲(chǔ)小偷的 ID 。

Eloquent 模型:
class Thief
{
    public function cars()
    {
       return $this->hasMany(Car::class);
    }
}
class Car
{
    public function thief()
    {
        return $this->belongsTo(Thief::class);
    }
}
數(shù)據(jù)遷移:
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");
});
記錄存儲(chǔ):
// 創(chuàng)建介于小偷與車之間的關(guān)聯(lián)。
$thief->cars()->saveMany([
   $car1, 
   $car2,
]);
// 或者在單一模型調(diào)用 save() 方法。
$thief->cars()->save($car);
// 創(chuàng)建介于 Car 和 Thief 的關(guān)聯(lián)。
$car->thief()->associate($thief)->save();
拉取記錄:
// 獲取小偷所偷的車
$thief->cars;
// 獲取偷盜某輛車的小偷
$car->thief;

多態(tài)一對(duì)多關(guān)系 演示細(xì)節(jié):

在這個(gè)演示中,我們有三個(gè)模型(Man, Woman 和 Car),和三張表(man, women 和 cars)。

業(yè)務(wù)規(guī)則:

一個(gè)男人(買家)可以買很多汽車。
一個(gè)女人(買家)可以買很多汽車。
這個(gè)汽車可以被一個(gè)買家購買(男人或女人)。

關(guān)系圖:

關(guān)系詳情:

Car表應(yīng)該儲(chǔ)存買家 ID?和買家類型。
"buyer" 是一組模型名稱 (男人 和 女人), 它不僅限于兩者,buyer 類型是模型的真實(shí)名稱 。

Eloquent 模型:
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();
    }
}
數(shù)據(jù)庫遷移:
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"
});
儲(chǔ)存記錄:
// 在買家 (男人 / 女人) 和汽車之間建立聯(lián)系。
$man->cars()->saveMany([
   $car1, 
   $car2,
]);
$woman->cars()->saveMany([
   $car1, 
   $car2,
]);
// 或者為單個(gè)模型使用 save() 函數(shù)。
$man->cars()->save($car);
$woman->cars()->save($car);
//創(chuàng)建汽車與買家之間的關(guān)系 ( 男人/女人 )。
$car1->buyer()->associate($man)->save();
$car2->buyer()->associate($woman)->save();
檢索記錄:
// 獲取買家 (男人 / 女人)的汽車
$men->cars
$women->cars
// 獲取這輛車的買家 (男人 / 女人)
$car->buyer

多對(duì)多關(guān)聯(lián) 示例展示:

在這個(gè)示例中,我們有兩個(gè)模型(Driver 和 Car),和三張表
(drivers,名為?car_driver的中間關(guān)聯(lián)表).

業(yè)務(wù)規(guī)則:

一個(gè)司機(jī)可以駕駛很多輛車。
一輛車可以被很多個(gè)司機(jī)開。

關(guān)系圖:

關(guān)聯(lián)詳情:

關(guān)聯(lián)表"car_driver"應(yīng)該保存駕駛員ID和汽車ID。

關(guān)聯(lián)模型:
class Driver
{
    public function cars()
    {
       return $this->belongsToMany(Car::class);
    }
}
class Car
{
    public function drivers()
    {
        return $this->belongsToMany(Driver::class);
    }
}
數(shù)據(jù)庫遷移:
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");
});
保存記錄:
//創(chuàng)建Driver和Car之間的關(guān)聯(lián)。
$driver->cars()->attach([
   $car1->id,
   $car2->id,
]);
//或者使用sync()函數(shù)防止重復(fù)關(guān)聯(lián)。
$driver->cars()->sync([
   $car1->id,
   $car2->id,
]);
//創(chuàng)建Car和Driver之間的關(guān)聯(lián)。
$car->drivers()->attach([
   $driver1->id,
   $driver2->id,
]);
//或者使用sync()函數(shù)防止重復(fù)關(guān)聯(lián)。
$car->drivers()->sync([
   $driver1->id,
   $driver2->id,
]);
查詢記錄:
// Get Driver Car
$driver->cars
// Get Car Drivers
$car->drivers

多對(duì)多多態(tài)關(guān)聯(lián) 展示細(xì)節(jié):

在這個(gè)展示中我們有三個(gè)模型(Valet、Owner 及 Car)和 4 張表(valets、owners、cars 及 drivers)。

商業(yè)邏輯:

一個(gè)代駕(司機(jī))可以駕駛很多輛車
一個(gè)車主(司機(jī))可以駕駛很多輛車
一臺(tái)車可以被很多個(gè)司機(jī)駕駛(代駕和 / 或車主)

關(guān)聯(lián)圖

關(guān)聯(lián)細(xì)節(jié):

中間表「drivers」應(yīng)該儲(chǔ)存駕駛?cè)?ID、駕駛?cè)祟愋图败囕v ID。
駕駛是一個(gè)模型集合的代稱(Valet 及 Owner),而且不限定兩個(gè)模型。駕駛?cè)祟愋褪悄P偷恼嬲Q。

Eloquent 模型:
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");
});
儲(chǔ)存紀(jì)錄:
// 在 driver(Valet / Owner)和 Car 間建立關(guān)聯(lián)
$valet->cars()->saveMany([$car1, $car2]);
$owner->cars()->saveMany([$car1, $car2]);
// 或使用 save() 方法來儲(chǔ)存單一模型
$valet->cars()->save($car1);
$owner->cars()->save($car1);
// 在 Car 和 driver(Valet / Owner)間建立關(guān)聯(lián)
$car->valets()->attach([
    $valet1->id,
    $valet2->id,
]);
$car->owners()->attach([
    $owner1->id,
    $owner2->id,
]);
// 或是用 sync() 方法來避免重複關(guān)聯(lián)
$car->valets()->sync([
    $valet1->id,
    $valet2->id,
]);
$car->owners()->sync([
    $owner1->id,
    $owner2->id,
]);
取得紀(jì)錄:
// 取得 driver(Valet / Owner)的 Cars
$valet->cars
$owner->cars

// 取得 Car 的 drivers(Valet 及 Owner)
$car->owners
$car->valets

更多現(xiàn)代化 PHP 知識(shí),請(qǐng)前往 Laravel / PHP 知識(shí)社區(qū)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29263.html

相關(guān)文章

  • Laravel & Lumen之Eloquent ORM使用速查-進(jìn)階部分

    摘要:關(guān)聯(lián)關(guān)系查詢?cè)谥?,所有的關(guān)系都是使用函數(shù)定義的,可以在不執(zhí)行關(guān)聯(lián)查詢的情況下獲取關(guān)聯(lián)的實(shí)例。 關(guān)聯(lián)關(guān)系 One To One 假設(shè)User模型關(guān)聯(lián)了Phone模型,要定義這樣一個(gè)關(guān)聯(lián),需要在User模型中定義一個(gè)phone方法,該方法返回一個(gè)hasOne方法定義的關(guān)聯(lián)

    Chaz 評(píng)論0 收藏0
  • Laravel & Lumen之Eloquent ORM使用速查-基礎(chǔ)部分

    摘要:使用時(shí),數(shù)據(jù)庫查詢構(gòu)造器的方法對(duì)模型類也是也用的,使用上只是省略了表名部分。在模型中使用成員變量指定綁定的表名。 使用Eloquent [el?kw?nt] 時(shí),數(shù)據(jù)庫查詢構(gòu)造器的方法對(duì)模型類也是也用的,使用上只是省略了DB::table(表名)部分。 在模型中使用protected成員變量$table指定綁定的表名。

    NervosNetwork 評(píng)論0 收藏0
  • Laravel & Lumen之Eloquent ORM使用速查-高級(jí)部分

    摘要:使用全局作用域功能可以為模型的所有操作增加約束。提供了一些方法可以方便的來實(shí)現(xiàn)數(shù)據(jù)類型之間的轉(zhuǎn)換。要定義一個(gè),需要在模型中創(chuàng)建一個(gè)名稱為的方法,其中的是駝峰命名法的字段名。 查詢作用域 全局作用域 全局作用域允許你對(duì)給定模型的所有查詢添加約束。使用全局作用域功能可以為模型的所有操作增加約束。 軟刪除功能實(shí)際上就是利用了全局作用域功能 實(shí)現(xiàn)一個(gè)全局作用域功能只需要定義一個(gè)實(shí)現(xiàn)Illumi...

    BigNerdCoding 評(píng)論0 收藏0
  • Laravel 5.1 LTS 查表重磅發(fā)布

    showImg(http://ww2.sinaimg.cn/large/005SFY0kjw1f2mt468a0cj31bs10mtk8.jpg); GitHub 項(xiàng)目在此: https://github.com/Aufree/laravel5-cheat... 本項(xiàng)目由 @Aufree 和 @Summer 整理維護(hù)。 說明 最近在開始使用 Laravel 進(jìn)行開發(fā), 在學(xué)習(xí)過程中無意間發(fā)現(xiàn)了 L...

    20171112 評(píng)論0 收藏0
  • 深入理解 Laravel Eloquent(三)——模型間關(guān)系(關(guān)聯(lián)

    摘要:是什么是一個(gè),全稱為,翻譯為對(duì)象關(guān)系映射如果只把它當(dāng)成數(shù)組庫抽象層那就太小看它了。所謂對(duì)象,就是本文所說的模型對(duì)象關(guān)系映射,即為模型間關(guān)系。至此,深入理解系列文章到此結(jié)束。 原文發(fā)表在我的個(gè)人網(wǎng)站:深入理解 Laravel Eloquent(三)——模型間關(guān)系(關(guān)聯(lián)) 在本篇文章中,我將跟大家一起學(xué)習(xí) Eloquent 中最復(fù)雜也是最難理解的部分——模型間關(guān)系。官方英文文檔中...

    2501207950 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<