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 模型。 使用多对多多态关联可以让您在文章和视频中共享唯一的标签列表。
Laravel之Eloquent ORM的更多相关文章
- laravel通过Eloquent ORM实现CURD
//Eloquent ORM public function orm1() { //all(); 返回所有数据: /*$students=Student::all(); dd($students);* ...
- Laravel使用Eloquent ORM操作数据库
1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ p ...
- Laravel之Eloquent ORM访问器调整器及属性转换
一.查询构建器的get方法 查询构建器的get方法返回了一个集合 $users = App\User::where('active', 1)->get(); foreach ($users as ...
- Laravel之Eloquent ORM关联
一.一对一 1.主对从(hasOne) 从User模型中取出用户的手机 User模型中: /** * 获取关联到用户的手机 */ public function phone() { return $t ...
- laravel 5.1 使用Eloquent ORM 操作实例
Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动. 每个数据库表对应一个模型文件. 数据库配置 .env文件(也可以直接修改config/da ...
- Laravel Eloquent ORM
Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...
- [转]Laravel 4之Eloquent ORM
Laravel 4之Eloquent ORM http://dingjiannan.com/2013/laravel-eloquent/ 定义Eloquent模型 模型通常放在app/models目录 ...
- Laravel 数据库操作 Eloquent ORM
laravel 操作数据库一般都使用它的Eloquent ORM才操作 建立模型 <?php namespace App; use Illuminate\Database\Eloquent\Mo ...
- [Laravel] 03 - DB facade, Query builder & Eloquent ORM
连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...
随机推荐
- 租酥雨的NOIP2018赛前日记
租酥雨的NOIP2018赛前日记 离\(\mbox{NOIP2018}\)只剩下不到一个月的时间辣! 想想自己再过一个月就要退役了,觉得有必要把这段时间的一些计划与安排记录下来. 就从国庆收假开始吧. ...
- 【spring源码分析】spring AspectJ的Execution表达式
在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 execution (* com.sam ...
- 推荐 Laravel API 项目必须使用的 8 个扩展包
如今在现代网络开发中,比较流行的模式是基于 API 开发,可以通过手机或网站来创建服务. Laravel 是创建基于 API 的项目的最佳框架之一,它为世界各地的大型社区提供了高速开发. Larave ...
- hive 数据导出三种方式
今天我们再谈谈Hive中的三种不同的数据导出方式.根据导出的地方不一样,将这些方式分为三种:(1).导出到本地文件系统:(2).导出到HDFS中:(3).导出到Hive的另一个表中.为了避免单纯的文字 ...
- openresty 使用cuid 类库生成短链接id
cuid 是一个不错的id 生成算发,类似的有shortid .hashid 演示使用lua 包集成openresty 做测试 使用docker-compose 运行 dockerfile FROM ...
- c#代码获取web.config配置文件里面设置的 <compilation debug="true"节点
== 在我们的web.config文件中,有像下面的这样的一个配置, <system.web> <identity impersonate="true" user ...
- kettle的资源库
在kettle中的转换或者作业等资源的存储的仓库称为资源库:分为文件资源库.数据库资源库. 一个转换或者作业可以属于某个资源库或者一个单独的文件形态存在. 一.数据库资源库 1.1在mysql中创建一 ...
- bat删除系统默认共享
在我们的系统中,有很多默认的共享是开启的,可以设置一个bat文件在每次开机的时候把共享删除. net share c$ /del net share d$ /del net share e$ /del ...
- Collection与Collections,Array与Arrays的区别
Collection 和 Collections的区别 Collection 在Java.util下的一个接口,它是各种集合结构的父接口.继承与他的接口主要有Set 和List. Collection ...
- tyvj1391走廊泼水节
题目:http://www.joyoi.cn/problem/tyvj-1391 考虑对于每一条边,新加的长度是(左边点数*右边点数-1)*(当前边权+1): 然后要kruskal的思想,把边从小到大 ...