一、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 模型。 使用多对多多态关联可以让您在文章和视频中共享唯一的标签列表。

Laravel之Eloquent ORM的更多相关文章

  1. laravel通过Eloquent ORM实现CURD

    //Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...

  2. Laravel使用Eloquent ORM操作数据库

    1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...

  3. Laravel之Eloquent ORM访问器调整器及属性转换

    一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...

  4. Laravel之Eloquent ORM关联

    一.一对一 1.主对从(hasOne) 从User模型中取出用户的手机 User模型中: /** * 获取关联到用户的手机 */ public function phone() { return $t ...

  5. laravel 5.1 使用Eloquent ORM 操作实例

    Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动. 每个数据库表对应一个模型文件. 数据库配置 .env文件(也可以直接修改config/da ...

  6. Laravel Eloquent ORM

    Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...

  7. [转]Laravel 4之Eloquent ORM

    Laravel 4之Eloquent ORM http://dingjiannan.com/2013/laravel-eloquent/ 定义Eloquent模型 模型通常放在app/models目录 ...

  8. Laravel 数据库操作 Eloquent ORM

    laravel 操作数据库一般都使用它的Eloquent ORM才操作 建立模型 <?php namespace App; use Illuminate\Database\Eloquent\Mo ...

  9. [Laravel] 03 - DB facade, Query builder & Eloquent ORM

    连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...

随机推荐

  1. hdu2068 RPG的错排 组合数/递推

    #include<stdio.h> ]; long long c(int a,int b) { ,j; ;i>=a-b+,j<=b;i--,j++) sum=sum*i/j; ...

  2. 视觉惯性里程计Visual–Inertial Odometry(VIO)概述

    周围很多朋友开始做vio了,之前在知乎上也和胖爷讨论过这个问题,本文主要来自于知乎的讨论. 来自https://www.zhihu.com/question/53571648/answer/13772 ...

  3. day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级

    类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...

  4. 脸部识别JavaScript类库Tracking.js

    作者 王文刚 发布于 2014年8月10日 |   对Web开发者而言,开源的JavaScript库Tracking.js正在使计算机视觉和增强现实技术变得简单, 使用它可以展示效果类似Kinect或 ...

  5. search bar 创建的一些文章

    1.   http://blog.csdn.net/oscarxie/article/details/1434608 2.   http://blog.csdn.net/oscarxie/articl ...

  6. 【转】每天一个linux命令(32):gzip命令

    原文网址:http://www.cnblogs.com/peida/archive/2012/12/06/2804323.html 减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输 ...

  7. vue-router 知识点

    vue-router配置scrollBehavior 第三个参数 savedPosition 当且仅当 popstate 导航 (通过浏览器的 前进/后退 按钮触发) 时才可用. 注意: 这个功能只在 ...

  8. webpack 基本使用

    1. 创建webpack-test文件夹 2. npm初始化 3. 安装webpack 4. 使用webpack打包 hello.js 是需要打包的文件  hello.bundle.js 是打包完以后 ...

  9. 出现“安全时间戳无效,因为其创建时间(“2013-10-30T14:42:07.861Z”)是将来的时间。当前时间为“2013-10-30T14:36:23.988Z”,允许的时钟偏差是“00:05:00””的原因

    具体原因是服务器的时间和本地的时间不能超过5分钟,超过5分钟了.只要修改你本地机器的时间,和服务器相差的时间不能超过5分钟,就可以了. 根本原因是windows 系统域认证要求的,所有都一样.

  10. Elasticsearch 基础入门

    原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...