Laravel之Eloquent ORM

一、ORM编程思想

1.1 Active Record 设计模式

    Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射。应用Active Record时,每一个类的实例对象唯一对应一个数据库表的一行(一对一关系)。你只需继承一个abstract Active Record 类就可以使用该设计模式访问数据库,其最大的好处是使用非常简单

1.2 调试工具 Laravel Debugbar

 

Installation:

composer require barryvdh/laravel-debugbar --dev

二、一对一关系映射

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 外键

自定义外键:

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); });

三、一对多关系映射

1:N hasMany(XXX:class) 反之:belongsTo(XXX:class) 

3.1 面向对象方式绑定一对多的关系

四、多对多关系映射

    中间表命名:按照A-Z首字母排序

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

4.1 面向对象方式绑定多对多的关系

detach解绑,sync方法用的比较多,只保留1,2

4.2 访问多对多中间数据表

五、HasManyThrough对象桥接式穿越关联(远层一对多)

数据表:

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, ]; });
$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), ]; });

获取每个国家论文总数:

五、多样化的一对多关系映射(多态关联)

面向对象多态:运行时加载机制


伪造数据:

六、多对多多态关联

除了传统的多态关联,您也可以定义「多对多」的多态关联。例如,Post 模型和 Video 模型可以共享一个多态关联至 Tag 模型。 使用多对多多态关联可以让您在文章和视频中共享唯一的标签列表。

猜你喜欢

转载自www.cnblogs.com/liliuguang/p/9945657.html
今日推荐