未加星标

[ Laravel 5.3 文档 ] Eloquent ORM ―― 起步

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
1、简介

Laravel自带的EloquentORM提供了一个美观、简单的与数据库打交道的ActiveRecord实现,每张数据表都对应一个与该表进行交互的“模型”,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。

在开始之前,确保在 config/database.php 文件中配置好了数据库连接。更多关于数据库配置的信息,请查看文档。

2、定义模型

作为开始,让我们创建一个 Eloquent 模型,模型通常位于 app 目录下,你也可以将其放在其他可以被 composer.json 文件自动加载的地方。所有Eloquent模型都继承自 Illuminate\Database\Eloquent\Model 类。

创建模型实例最简单的办法就是使用 Artisan 命令 make:model :

php artisan make:model User

如果你想要在生成模型时生成数据库迁移,可以使用 --migration 或 -m 选项:

php artisan make:model User --migration
php artisan make:model User -m Eloquent 模型约定

现在,让我们来看一个 Flight 模型类例子,我们将用该类获取和存取数据表 flights 中的信息:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
//
} 表名

注意我们并没有告诉 Eloquent 我们的 Flight 模型使用哪张表。默认规则是模型类名的复数作为与其对应的表名,除非在模型类中明确指定了其它名称。所以,在本例中,Eloquent 认为 Flight 模型存储记录在 flights 表中。你也可以在模型中定义 table 属性来指定自定义的表名:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
/**
* 关联到模型的数据表
*
* @var string
*/
protected $table = 'my_flights';
} 主键

Eloquent 默认每张表的主键名为 id ,你可以在模型类中定义一个 $primaryKey 属性来覆盖该约定。

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

时间戳

默认情况下,Eloquent 期望 created_at 和 updated_at 已经存在于数据表中,如果你不想要这些 Laravel 自动管理的列,在模型类中设置 $timestamps 属性为 false :

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
/**
* 表明模型是否应该被打上时间戳
*
* @var bool
*/
public $timestamps = false;
}

如果你需要自定义时间戳格式,设置模型中的 $dateFormat 属性。该属性决定日期被如何存储到数据库中,以及模型被序列化为数组或 JSON 时日期的格式:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
/**
* 模型日期列的存储格式
*
* @var string
*/
protected $dateFormat = 'U';
}

数据库连接

默认情况下,所有的 Eloquent 模型使用应用配置中的默认数据库连接,如果你想要为模型指定不同的连接,可以通过 $connection 属性来设置:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model{
/**
* The connection name for the model.
*
* @var string
*/
protected $connection = 'connection-name';
} 3、获取模型

创建完模型及其关联的数据表后,就要准备从数据库中获取数据。将Eloquent模型看作功能强大的查询构建器,你可以使用它来流畅的查询与其关联的数据表。例如:

<?php
use App\Flight;
$flights = App\Flight::all();
foreach ($flights as $flight) {
echo $flight->name;
} 添加额外约束

Eloquent 的 all 方法返回模型表的所有结果,由于每一个Eloquent模型都是一个查询构建器,你还可以添加约束条件到查询,然后使用 get 方法获取对应结果:

$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();

注意:由于 Eloquent 模型本质上就是查询构建器,你可以在Eloquent查询中使用查询构建器的所有方法。

集合

对 Eloquent 中获取多个结果的方法(比如 all 和 get )而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例, Collection 类提供了多个有用的函数来处理Eloquent结果集:

$flights = $flights->reject(function ($flight) {
return $flight->cancelled;
});

当然,你也可以像数组一样循环遍历该集合:

foreach ($flights as $flight) {
echo $flight->name;
} 组块结果集

如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令。 chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用 chunk 方法能够在处理大量数据集合时有效减少内存消耗:

Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
//
}
});

传递给该方法的第一个参数是你想要获取的“组块”数目,闭包作为第二个参数被调用用于处理每个从数据库获取的区块数据。

使用游标

cursor

方法允许你使用游标迭代处理数据库记录,一次只执行单个查询,在处理大批量数据时, cursor 方法可大幅减少内存消耗:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
//
} 4、获取单个模型/聚合

当然,除了从给定表中获取所有记录之外,还可以使用 find 和 first 获取单个记录。这些方法返回单个模型实例而不是返回模型集合:

// 通过主键获取模型...
$flight = App\Flight::find(1);
// 获取匹配查询条件的第一个模型...
$flight = App\Flight::where('active', 1)->first();

还可以通过传递主键数组来调用 find 方法,这将会返回匹配记录集合:

$flights = App\Flight::find([1, 2, 3]); Not Found 异常

有时候你可能想要在模型找不到的时候抛出异常,这在路由或控制器中非常有用, findOrFail 和 firstOrFail 方法会获取查询到的第一个结果。然而,如果没有任何查询结果, Illuminate\Database\Eloquent\ModelNotFoundException 异常将会被抛出:

$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();

如果异常没有被捕获,那么HTTP404响应将会被发送给用户,所以在使用这些方法的时候没有必要对返回404响应编写明确的检查:

Route::get('/api/flights/{id}', function ($id) {
return App\Flight::findOrFail($id);
}); 获取聚合

当然,你还可以使用查询构建器聚合方法,例如 count 、 sum 、 max ,以及其它查询构建器提供的聚合方法。这些方法返回计算后的结果而不是整个模型实例:

$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price'); 5、插入/更新模型 插入

想要在数据库中插入新的记录,只需创建一个新的模型实例,设置模型的属性,然后调用 save 方法:

<?php
namespace App\Http\Controllers;
use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class FlightController extends Controller{
/**
* 创建一个新的航班实例
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// Validate the request...
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
}
}

在这个例子中,我们只是简单分配HTTP请求中的 name 参数值给 App\Flight 模型实例的那么属性,当我们调用 save 方法时,一条记录将会被插入数据库。 created_at 和 updated_at 时间戳在 save 方法被调用时会自动被设置,所以没必要手动设置它们。

更新

save 方法还可以用于更新数据库中已存在的模型。要更新一个模型,应该先获取它,设置你想要更新的属性,然后调用 save 方法。同样, updated_at 时间戳会被自动更新,所以没必要手动设置其值:

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

更新操作还可以同时修改给定查询提供的多个模型实例,在本例中,所有有效且 destination=San Diego 的航班都被标记为延迟:

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

update 方法要求以数组形式传递键值对参数,代表着数据表中应该被更新的列。

注:通过Eloquent进行批量更新时, saved 和 updated 模型事件将不会在更新模型时触发。这是因为在进行批量更新时并没有从数据库获取模型。

批量赋值

还可以使用 create 方法保存一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的 fillable 或 guarded 属性,因为所有Eloquent模型都通过批量赋值(Mass Assignment)进行保护。

当用户通过 HTTP 请求传递一个不被期望的参数值时就会出现安全隐患,然后该参数以不被期望的方式修改数据库中的列值。例如,恶意用户通过 HTTP 请求发送一个 i

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

主题: Laravel数据数据库理大删除
分页:12
转载请注明
本文标题:[ Laravel 5.3 文档 ] Eloquent ORM ―― 起步
本站链接:http://www.codesec.net/view/480128.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(42)