快速入门

更换表名

protected $table = 'my_flights';

更换主键名称

protected $primaryKey  = 'id';

注意: Eloquent 默认主键字段是自增的整型数据, 这意味着主键将会被自动转化为 int 类型, 如果你想要使用非自增或非数字类型主键, 必须在对应模型中设置 $incrementing 属性为 false , 如果主键不是整型, 还要设置 $keyType 属性值为 string.

关闭时间戳记录

public $timestamps = false;

获取模型数据

// Eloquent 的 all 方法返回模型表的所有结果
$flights = App\Flight::all(); foreach ($flights as $flight) {
echo $flight->name;
} // 添加约束条件
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();

获取单个模型

// 通过主键获取模型
$flight = App\Flight::find(1);
// 获取匹配查询条件的第一个模型
$flight = App\Flight::where('active', 1)->first();
// 通过传递主键数组来调用 find 方法, 这将会返回匹配记录集合
$flights = App\Flight::find([1, 2, 3]);

获取聚合结果

$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');

插入记录

$flight = new Flight;
$flight->name = $request->name;
$flight->save();

更新模型

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

批量更新

App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);

删除模型

// 删除
$flight = App\Flight::find(1);
$flight->delete(); // 通过主键删除模型
App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3); // 通过查询删除模型
$deletedRows = App\Flight::where('active', 0)->delete();

软删除

// Eloquent 模型
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
use SoftDeletes;
/**
* 应该被调整为日期的属性
*
* @var array
*/
protected $dates = ['deleted_at'];
} // 数据表结构添加 deleted_at 列
Schema::table('flights', function ($table) {
$table->softDeletes();
}); // 判断给定模型实例是否被软删除, 可以使用 trashed 方法
if ($flight->trashed()) {
// ...
} // 查询被软删除的模型
$flights = App\Flight::withTrashed()
->where('account_id', 1)
->get();
$flight->history()->withTrashed()->get(); // 只获取软删除模型
$flights = App\Flight::onlyTrashed()
->where('airline_id', 1)
->get(); // 恢复软删除模型
$flight->restore(); // 使用 restore 方法来快速恢复多个模型, 不会触发任何模型事件
App\Flight::withTrashed()
->where('airline_id', 1)
->restore();
$flight->history()->restore();

本地作用域

/**
* 只包含活跃用户的查询作用域
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
} /**
* 只包含激活用户的查询作用域
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeActive($query)
{
return $query->where('active', 1);
}
// 使用本地作用域
$users = App\User::popular()->active()->orderBy('created_at')->get();

动态作用域

/**
* 让查询只包含给定类型的用户
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $type
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeOfType($query, $type)
{
return $query->where('type', $type);
}
// 使用动态作用域
$users = App\User::ofType('admin')->get();

模型关联

一对一关联

// 拥有
class User extends Model
{
/**
* 获取关联到用户的手机
*/
public function phone()
{
// Phone : 关联的模型
// Phone : user_id 外键
// User : id 主键
return $this->hasOne('App\Phone', 'user_id', 'id');
}
} // 所属
class Phone extends Model
{
/**
* 获取拥有该手机的用户
*/
public function user()
{
// User : 所属的模型
// Phone : user_id 外键
// User : id 父模型主键
return $this->belongsTo('App\User', 'user_id', 'id');
}
} // 空模型
class Article extends Model
{
/**
* 获取文章作者
*/
public function user()
{
return $this->belongsTo('App\User')->withDefault(function ($user) {
$user->name = 'Guest Author';
});
}
}

一对多关联

// 拥有
class Post extends Model
{
/**
* 获取博客文章的评论
*/
public function comments()
{
// Comment : 关联的模型
// Comment : post_id 外键
// Post : id 主键
return $this->hasMany('App\Comment', 'post_id', 'id');
}
} // 所属
class Comment extends Model
{
/**
* 获取评论对应的博客文章
*/
public function post()
{
// Post : 关联的模型
// Comment : post_id 外键
// Post : id 父模型主键
return $this->belongsTo('App\Post', 'post_id', 'id');
}
}

多对多关联

// 关联
class User extends Model
{
/**
* 用户角色
*/
public function roles()
{
// Role : 关联的模型
// user_roles : 中间表名称
// user_id : 对应到模型主键
// role_id : 对应到关联主键
return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
}
} // 获取中间表字段, 通过 pivot 属性
$user = App\User::find(1);
foreach ($user->roles as $role) {
echo $role->pivot->created_at;
} // 当 pivot 表包含额外的属性时, 必须定义关联时先指定
return $this->belongsToMany('App\Role')->withPivot('column1', 'column2'); // 自动包含created_at 和 updated_at
return $this->belongsToMany('App\Role')->withTimestamps(); // 更换 pivot 为 subscription, 提升可读性
return $this->belongsToMany('App\Podcast')
->as('subscription')
->withTimestamps();
$users = User::with('podcasts')->get();
foreach ($users->flatMap->podcasts as $podcast) {
echo $podcast->subscription->created_at;
}

渴求式加载

// select * from books
$books = App\Book::all();
// select * from authors where id in (1, 2, 3, 4, 5, ...)
$books = App\Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
} // 渴求式加载多个关联关系
$books = App\Book::with('author', 'publisher')->get(); // 嵌套的渴求式加载
$books = App\Book::with('author.contacts')->get(); // 渴求式加载指定字段
// 注: 使用这个特性时, id 字段是必须列出的
$users = App\Book::with('author:id,name')->get(); // 带条件约束的渴求式加载
$users = App\User::with(['posts' => function ($query) {
$query->where('title', 'like', '%first%');
}])->get();

插入 / 更新关联模型

// 插入关联模型
$comment = new App\Comment(['message' => 'A new comment.']);
$post = App\Post::find(1);
// 调用 comments 方法获取关联关系实例, save 将添加 post_id 到 Comment 模型中
$post->comments()->save($comment); // 保存多个关联模型
$post = App\Post::find(1);
$post->comments()->saveMany([
new App\Comment(['message' => 'A new comment.']),
new App\Comment(['message' => 'Another comment.']),
]); // 使用 create 创建, 与 save 不同的是, 它j接收一个关联数组, create 方法遵循模型属性的批量赋值操作
$post = App\Post::find(1);
$comment = $post->comments()->create([
'message' => 'A new comment.',
]); // 保存多个关联模型
$post = App\Post::find(1);
$post->comments()->createMany([
[
'message' => 'A new comment.',
],
[
'message' => 'Another new comment.',
],
]); // 更新从属关联关系 (belongsTo)
$account = App\Account::find(10);
// associate 方法会在子模型设置外键
$user->account()->associate($account);
$user->save(); // 移除关联 (belongsTo)
// dissociate 方法会设置关联关系的外键为 null
$user->account()->dissociate();
$user->save();

附加 / 分离多对多关联模型

$user = App\User::find(1);
// 在连接模型的中间表中插入记录
$user->roles()->attach($roleId);
// 插入数据和附加的数组到中间表
$user->roles()->attach($roleId, ['expires' => $expires]); // 从中间表中移除相应的记录: 指定用户移除某个角色
$user->roles()->detach($roleId);
// 从中间表中移除相应的记录: 指定用户移除所有角色
$user->roles()->detach(); // attach 和 detach 还接收数组形式的 ID 作为输入
$user = App\User::find(1);
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([
1 => ['expires' => $expires],
2 => ['expires' => $expires]
]);

在中间表上保存额外数据

处理多对多关联时, save 方法接收中间表数组作为第二个参数:

App\User::find(1)->roles()->save($role, ['expires' => $expires]);

访问器和修改器

访问器和修改器 允许你在获取模型属性或设置其值时格式化 Eloquent 属性.

例如, 你可能想要使用 Laravel 加密器对存储在数据库中的数据进行加密, 并且在 Eloquent 模型中访问时自动进行解密.

除了自定义访问器和修改器, Eloquent 还可以自动转换日期字段为 Carbon 实例甚至 将文本转换为 JSON .

访问器

class User extends Model
{
/**
* 获取用户的名字
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
} /**
* 获取用户的全名
*
* @return string
*/
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
}
// 访问 first_name 属性
$firstName = App\User::find(1)->first_name;

修改器

class User extends Model
{
/**
* 设置用户的名字
*
* @param string $value
* @return string
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
// 设置 first_name 属性
App\User::find(1)->first_name = 'Sally';

日期修改器

默认情况下, Eloquent 将会转化 created_atupdated_at 列的值为 Carbon 实例, 该类继承自 PHP 原生的 Datetime 类, 并提供了各种有用的方法. 你可以自定义哪些字段被自动调整修改, 甚至可以通过重写模型中的 $dates 属性完全禁止调整:

class User extends Model
{
/**
* 应该被调整为日期的属性
*
* @var array
*/
protected $dates = [
'created_at',
'updated_at',
'disabled_at'
];
} // 自动转换并存储到数据库中
$user = App\User::find(1);
$user->disabled_at = Carbon::now();
$user->save(); // 使用 Carbon 提供的方法
$user = App\User::find(1);
return $user->disabled_at->getTimestamp();

模型日期格式

默认情况下, 时间戳的格式是 Y-m-d H:i:s , 可以结合 $dateFormat 属性自定义格式:

class Flight extends Model
{
/**
* 模型日期的存储格式
*
* @var string
*/
protected $dateFormat = 'U';
}

属性转换

支持的转换类型: integer , real , float , double , string , boolean , object , array , collection , date , datetimetimestamp .

如果数据库有一个 JSONTEXT 字段类型包含了序列化 JSON, 可使用 array 转换, 将自动进行 序列化反序列化 .

class User extends Model
{
/**
* 应该被转化为原生类型的属性
*
* @var array
*/
protected $casts = [
// 转换 is_admin 属性: 从 integer (0/1) 转换为 boolean
'is_admin' => 'boolean',
// 访问 options 属性将会自动从 JSON 反序列化为 PHP 数组
// 设置 options 属性的值时, 给定数组将会自动转化为 JSON 以供存储
'options' => 'array',
];
} // is_admin 属性已经被转换了:
if ($user->is_admin) {
//
} // 自动序列化和反序列化
$user = App\User::find(1);
$options = $user->options;
$options['key'] = 'value';
$user->options = $options;
$user->save();

文章来源于本人博客,发布于 2018-06-02,原文链接:https://imlht.com/archives/152/

最为常用的Laravel操作(1)-Eloquent模型的更多相关文章

  1. 【Laravel】为Eloquent 模型设置全局作用域和局部作用域进行查询

    全局作用域 所谓「全局作用域」,指的是预置过滤器在注册该「全局作用域」的模型类的所有查询中生效,不需要指定任何额外条件. 以 User 模型类为例,我们在系统中可能只想针对已经验证过邮箱的用户进行操作 ...

  2. Laravel—数据库操作与Eloquent模型使用总结

    数据库操作 执行原生SQL //查询 $emp = DB::select('select * from employees where emp_no = 1'); $emp = DB::select( ...

  3. Laravel 5.1 文档攻略 —— Eloquent:模型关系

    简介 其实大家都知道,数据表之间都是可以关联的,前面讲过了,Eloquent ORM是数据模型操作代替表操作,那么表的关联查询,在Eloquent这里也就是模型间的关联查询,这就是本章的主要内容: E ...

  4. 使用laravel的Eloquent模型获取数据库的指定列

    使用laravel的Eloquent模型获取数据库的指定列   使用Laravel的ORM——Eloquent时,时常遇到的一个操作是取模型中的其中一些属性,对应的就是在数据库中取表的特定列. 如果使 ...

  5. laravel Eloquent 模型(也就是我本时说的Model)

    laravel的 Eloquent 模型其实就是我们平时说的MVC里Model,只是换了个名字而已~ 1)Eloquent 是啥? Eloquent 本质就一个查询构建器(laravel里叫查询构建器 ...

  6. 【laravel】Eloquent 模型事件和监听方式

    所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creatin ...

  7. Laravel笔记--Eloquent 模型

    Eloquent 模型 默认继承use Illuminate\Database\Eloquent\Model类. 数据表名称与模型名称约定: 数据库的表名一般使用“蛇形命名法”命名.蛇形命名法要求单词 ...

  8. [Laravel] 16 - DB: Eloquent

    前言 一.大纲 写后端API,与数据库打交道无疑是很重要的角色. PHP数据库操作:从MySQL原生API到PDO PHP数据库操作:使用ORM Ref: [PHP] 07 - Json, XML a ...

  9. [转]Laravel 4之Eloquent ORM

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

  10. laravel操作mongo详细说明

    原文地址:http://returnc.com/detail/3728   一个Eloquent模型和Query构建器,支持MongoDB,使用原始的Laravel API.该库扩展了原始的Larav ...

随机推荐

  1. 2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎 假设石头的重量分别为 x 和

    2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎 假设石头的重量分别为 x 和 ...

  2. Ajax 方法返回值无效

    遇到错误为再ajax 中返回数据不起作用 原来是因为在阿贾克斯success中不能直接return 需要执行完再进行返回 以下代码为正确代码        function TestAction(id ...

  3. Kubernetes(K8S) kubesphere 介绍

    使用 Kubeadm 部署 Kubernetes(K8S) 安装--附K8S架构图 官网地址:https://kubesphere.com.cn/ KubeSphere 是个全栈的Kubernetes ...

  4. Vue中实现数据列表无缝轮播

    类似这种滚动轮播效果 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char ...

  5. FFmpeg开发笔记(二)搭建Windows系统的开发环境

    由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...

  6. pytest的fixture

    1 什么是fixture @pytest.fixture def my_fruit(): return Fruit("apple") 如上,用@pytest.fixture装饰的函 ...

  7. 2021-01-19:mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉。请问如何操作?

    2021-01-19:mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉.请问如何操作?福哥答案20 ...

  8. 狂神说ngnix笔记

    Nginx 一.什么是Nginx 二.Nginx的作用 三.Nginx的安装 1. Windows下安装 2.Linux下安装 3.Nginx目录结构 4.Nginx常用命令 5.Nginx配置文件结 ...

  9. 开发者一定要知道的 API 管理五大趋势

    API First 大势所趋,APIaaS(API 作为服务)也将受到越来越多企业和组织的选择,研发团队对 API 研发管理工具的要求也水涨船高. API 在今天的数字化世界中扮演着至关重要的角色,随 ...

  10. CentOS Linux 7 安全基线设置

    作为一个生信人,不管是日常的数据分析还是其他工具应用的开发,服务器的安全始终是一个无法避免的话题.尤其是当我们拿到一台新的服务器,我们需要怎样才能确保它是安全可靠,并最小限度降低它被攻击的可能性? 下 ...