前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel之Eloquent ORM

Laravel之Eloquent ORM

作者头像
唐成勇
发布2019-05-26 10:54:57
1.9K0
发布2019-05-26 10:54:57
举报
文章被收录于专栏:唐成勇唐成勇

一、ORM编程思想

1.1 Active Record 设计模式

clipboard.png
clipboard.png
clipboard.png
clipboard.png

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

clipboard.png
clipboard.png
clipboard.png
clipboard.png

1.2 调试工具 Laravel Debugbar

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

Installation:

代码语言:javascript
复制
composer require barryvdh/laravel-debugbar --dev

二、一对一关系映射

2.1 创建表

代码语言:javascript
复制
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 正向关系绑定

代码语言:javascript
复制
public function profile()
{
    return $this->hasOne(Profile::class);
}

2.2.2 反向关系绑定

代码语言:javascript
复制
public function user()
{
    return $this->belongsTo(User::class);
}

2.3 外键

clipboard.png
clipboard.png

自定义外键:

代码语言:javascript
复制
return $this->hasOne(Profile::class,'显示指定自定义外键');

2.4 一对一测试

依赖注入Request $request,获取当前登录用户$request->user()

代码语言:javascript
复制
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);
});

三、一对多关系映射

clipboard.png
clipboard.png
代码语言:javascript
复制
1:N hasMany(XXX:class) 

反之:belongsTo(XXX:class)
clipboard.png
clipboard.png
clipboard.png
clipboard.png

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

clipboard.png
clipboard.png

四、多对多关系映射

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

代码语言:javascript
复制
public function users()
{
    return $this->belongsToMany(User::class);
}

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

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

clipboard.png
clipboard.png

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

clipboard.png
clipboard.png

4.2 访问多对多中间数据表

clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png

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

数据表:

代码语言:javascript
复制
countries
    id - integer
    name - string

users
    id - integer
    country_id - integer
    name - string

posts
    id - integer
    user_id - integer
    title - string
代码语言:javascript
复制
class Country extends Model
{
    protected $fillable = ['name'];

    /**
     * 获得某个国家下所有的用户文章。
     */
    public function papers()
    {
        return $this->hasManyThrough(Paper::class,User::class);
    }
}
代码语言:javascript
复制
$factory->define(App\Paper::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'user_id' => \App\User::all()->random()->id,
    ];
});
clipboard.png
clipboard.png
代码语言:javascript
复制
$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
clipboard.png

获取每个国家论文总数:

clipboard.png
clipboard.png

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

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

clipboard.png
clipboard.png

更多:https://laravel-china.org/doc... 伪造数据:

clipboard.png
clipboard.png
clipboard.png
clipboard.png

六、多对多多态关联

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

参考教程:Coding 10编程原动力-Eloquent ORM Laravel 中文文档:Eloquent:关联

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、ORM编程思想
    • 1.1 Active Record 设计模式
      • 1.2 调试工具 Laravel Debugbar
      • 二、一对一关系映射
        • 2.1 创建表
          • 2.2 创建模型关系
            • 2.2.1 正向关系绑定
            • 2.2.2 反向关系绑定
          • 2.3 外键
            • 2.4 一对一测试
            • 三、一对多关系映射
              • 3.1 面向对象方式绑定一对多的关系
              • 四、多对多关系映射
                • 4.1 面向对象方式绑定多对多的关系
                  • 4.2 访问多对多中间数据表
                  • 五、HasManyThrough对象桥接式穿越关联(远层一对多)
                  • 五、多样化的一对多关系映射(多态关联)
                  • 六、多对多多态关联
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档