zoukankan      html  css  js  c++  java
  • 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 = AppProfile::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(AppPaper::class, function (Faker $faker) {
        return [
            'title' => $faker->sentence,
            'user_id' => AppUser::all()->random()->id,
        ];
    });
    $factory->define(AppUser::class, function (Faker $faker) {
        return [
            'name' => $faker->name,
            'email' => $faker->unique()->safeEmail,
            'country_id' => AppCountry::all()->random()->id,
            'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
            'remember_token' => str_random(10),
        ];
    });

    获取每个国家论文总数:

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

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


    伪造数据:

    六、多对多多态关联

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

  • 相关阅读:
    [转载]android开发手册
    [转载]windows phone7 学习笔记10——生命周期/墓碑化
    [转载]Windows Phone 系列 本地数据存储
    【转载】windows phone7 学习笔记12——推送通知服务
    【转载】windows phone7 学习笔记15——Bing Maps
    [转载]WP7交互特性浅析及APP设计探究
    【】windows phone7 学习笔记11——启动器与选择器
    [转载]支持的 Windows Phone 媒体编解码器
    【转载】wp7屏幕截图代码
    【转载】windows phone7 学习笔记14——地理位置服务与反应性扩展框架
  • 原文地址:https://www.cnblogs.com/liliuguang/p/9945657.html
Copyright © 2011-2022 走看看