Laravel之Eloquent ORM

1、ORM編程思想

1.1 Active Record 設計模式

clipboard.png

clipboard.png

    Active Record 是一種數據訪問設計模式,它能夠幫助你實現數據對象Object到關係數據庫的映射。應用Active Record時,每個類的實例對象惟一對應一個數據庫表的一行(一對一關係)。你只需繼承一個abstract Active Record 類就可使用該設計模式訪問數據庫,其最大的好處是使用很是簡單laravel

clipboard.png

clipboard.png

1.2 調試工具 Laravel Debugbar

https://github.com/barryvdh/l...git

Installation:github

composer require barryvdh/laravel-debugbar --dev

2、一對一關係映射

2.1 建立表

public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('phone');
            $table->unsignedInteger('user_id');
            //顯示的聲明外鍵:通知數據庫根據外鍵關聯表和創建索引,提升運行速度
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');

            $table->timestamps();
        });
    }

2.2 建立模型關係

2.2.1 正向關係綁定

public function profile()
{
    return $this->hasOne(Profile::class);
}

2.2.2 反向關係綁定

public function user()
{
    return $this->belongsTo(User::class);
}

2.3 外鍵

clipboard.png

自定義外鍵:數據庫

return $this->hasOne(Profile::class,'顯示指定自定義外鍵');

2.4 一對一測試

    依賴注入Request $request,獲取當前登陸用戶$request->user()編程

Route::get('/test',function (Request $request){
    //反向
//    $profile = \App\Profile::find(1);
//    dd($profile->user);
    $user = $request->user();

//    if (is_null($user->profile)){
//        $user->profile()->create([
//            'phone' => '15801340269'
//        ]);
//    }
    //用firstOrCreate改進if
    $user->profile()->firstOrCreate(['user_id' => $user->id],[

        'phone' => '18363046291'
    ]);

    //訪問屬性同樣訪問方法
    dd($user->profile);
});

3、一對多關係映射

clipboard.png

1:N hasMany(XXX:class) 

反之:belongsTo(XXX:class)

clipboard.png

clipboard.png

3.1 面向對象方式綁定一對多的關係

clipboard.png

4、多對多關係映射

    中間表命名:按照A-Z首字母排序設計模式

public function users()
{
    return $this->belongsToMany(User::class);
}

public function habits()
{
    return $this->belongsToMany(Habit::class);
}

4.1 面向對象方式綁定多對多的關係

clipboard.png

detach解綁,sync方法用的比較多,只保留1,2
clipboard.pngcomposer

4.2 訪問多對多中間數據表

clipboard.png

clipboard.png

clipboard.png

5、HasManyThrough對象橋接式穿越關聯(遠層一對多)

數據表:dom

countries
    id - integer
    name - string

users
    id - integer
    country_id - integer
    name - string

posts
    id - integer
    user_id - integer
    title - string
class Country extends Model
{
    protected $fillable = ['name'];

    /**
     * 得到某個國家下全部的用戶文章。
     */
    public function papers()
    {
        return $this->hasManyThrough(Paper::class,User::class);
    }
}
$factory->define(App\Paper::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'user_id' => \App\User::all()->random()->id,
    ];
});

clipboard.png

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'country_id' => \App\Country::all()->random()->id,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

clipboard.png

獲取每一個國家論文總數:ide

clipboard.png

5、多樣化的一對多關係映射(多態關聯)

面向對象多態:運行時加載機制

clipboard.png

更多:https://laravel-china.org/doc...
僞造數據:
clipboard.png工具

clipboard.png

6、多對多多態關聯

除了傳統的多態關聯,您也能夠定義「多對多」的多態關聯。例如,Post 模型和 Video 模型能夠共享一個多態關聯至 Tag 模型。 使用多對多多態關聯可讓您在文章和視頻中共享惟一的標籤列表。
更多:https://laravel-china.org/doc...

參考教程:Coding 10編程原動力-Eloquent ORM
Laravel 中文文檔:Eloquent:關聯

相關文章
相關標籤/搜索