Eloquent ORM
简介
Laravel 自带的 Eloquent ORM 为您的数据库提供了一个优雅的、简单的 ActiveRecord 实现。每一个数据库的表有一个对应的 "Model" 用来与这张表交互。
在开始之前,确认已在 app/config/database.php
文件中配置好数据库连接。
基本用法
首先,创建一个 Eloquent 模型。模型通常在 app/models
目录,但是您可以自由地把它们放在任何地方,只要它能根据您的 composer.json
文件自动加载。
定义一个 Eloquent 模型
class User extends Eloquent {}
注意我们并没有告诉 Eloquent 我们为 User
模型使用了哪一张表。类名的小写、复数的形式将作为表名,除非它被显式地指定。所以,在这种情况下,Eloquent 将假设 User
模型在 users
表中保存记录。您可以在模型中定义一个 table
属性来指定一个自定义的表名:
class User extends Eloquent {
protected $table = 'my_users';
}
Eloquent 将假设每张表有一个 名为 id
的主键。您可以定义 primaryKey
属性来覆盖这个约定。同样,您可以定义一个 connection
属性来覆盖在使用这个模型时所用的数据库连接。
一旦模型被定义,您可以开始在表中检索和创建记录。注意在默认情况下您将需要在表中定义 updated_at
和 created_at
字段。如果您不希望这些列被自动维护,在模型中设置 $timestamps
属性为 false
。
获取所有记录
$users = User::all();
根据主键获取一条记录
$user = User::find(1);
var_dump($user->name);
所有在 [查询构建器] 中适用的函数在 Eloquent 模型的查询中同样适用。
根据主键获取一条记录或者抛出一个异常
有时您可能希望当记录没有被找到时抛出一个异常,允许您使用 App::error
处理器捕捉这些异常并显示404页面。
$model = User::findOrFail(1);
$model = User::where('votes', '>', 100)->firstOrFail();
注册错误处理器,请监听 ModelNotFoundException
:
use Illuminate\Database\Eloquent\ModelNotFoundException;
App::error(function(ModelNotFoundException $e)
{
return Response::make('Not Found', 404);
});
使用 Eloquent 模型查询
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user)
{
var_dump($user->name);
}
当然,您也可以使用查询构建器的统计函数。
Eloquent 统计
$count = User::where('votes', '>', 100)->count();
如果您无法通过通过连贯的接口产生查询,可以使用 whereRaw
:
$users = User::whereRaw('age > ? and votes = 100', array(25))->get();
Chunking Results
If you need to process a lot (thousands) of Eloquent records, using the chunk
command will allow you to do without eating all of your RAM:
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
The first argument passed to the method is the number of records you wish to receive per "chunk". The Closure passed as the second argument will be called for each chunk that is pulled from the database.
指定查询的数据库连接
您可能需要在运行一个 Eloquent 查询的时候指定数据库连接,只需要使用 on
函数:
$user = User::on('connection-name')->find(1);
集体赋值
当创建一个新的模型,您可以传递属性的数组到模型的构造函数。这些属性将通过集体赋值分配给模型。这是很方便的,但把用户的输入盲目地传给模型可能是一个严重的安全问题。如果把用户输入盲目地传递给模型,用户可以自由地修改任何或者全部模型的属性。基于这个原因,默认情况下所有 Eloquent 模型将防止集体赋值。
首先,在模型中设置 fillable
或 guarded
属性。
fillable
属性指定哪些属性可以被集体赋值。这可以在类或接口层设置。
在模型中定义 Fillable 属性
class User extends Eloquent {
protected $fillable = array('first_name', 'last_name', 'email');
}
在这个例子中,只有三个被列出的属性可以被集体赋值。
fillable
的反义词是 guarded
,将做为一个黑名单而不是白名单:
在模型中定义 Guarded 属性
class User extends Eloquent {
protected $guarded = array('id', 'password');
}
在这个例子中,id
和 password
属性将不被允许集体赋值。所有其他属性将被允许集体赋值。您可以使用 guard 方法阻止所有属性被集体赋值:
阻止所有属性集体赋值
protected $guarded = array('*');
插入、更新、删除
为了从模型中向数据库中创建一个新的记录,简单地创建一个模型实例并调用 save
函数。
保存一个新的模型
$user = new User;
$user->name = 'John';
$user->save();
通常您的 Eloquent 模型将有自动递增的键。然而,如果您希望指定您自定义的键,在模型中设置 incrementing
属性为 false
。
您也可以使用 create
函数在一行代码中保存一个新的模型。被插入的模型实例将从函数中返回。但是,在您这样做之前,您需要在模型中指定 fillable
或者 guarded
属性,因为所有 Eloquent 模型默认阻止集体赋值。
在保存或创建一个使用自增ID的新模型之后,可以通过对象的 id
属性获取此自增ID:
$insertedId = $user->id;
在模型中设置 Guarded 属性
class User extends Eloquent {
protected $guarded = array('id', 'account_id');
}
使用模型的 Create 函数
// Create a new user in the database...
$user = User::create(array('name' => 'John'));
// Retrieve the user by the attributes, or create it if it doesn't exist...
$user = User::firstOrCreate(array('name' => 'John'));
// Retrieve the user by the attributes, or instantiate a new instance...
$user = User::firstOrNew(array('name' => 'John'));
为了更新一个模型,您可以检索它,改变一个属性,然后使用 save
函数:
更新一个检索到的模型
$user = User::find(1);
$user->email = 'john@foo.com';
$user->save();
有时您可能希望不仅保存模型,还有它的所有关系。为此,您可以使用 push
函数 :
保存一个模型和关系
$user->push();
您也可以在一组模型上运行更新:
$affectedRows = User::where('votes', '>', 100)->update(array('status' => 2));
删除一个模型,在实例中调用 delete
函数:
删除一个存在的模型
$user = User::find(1);
$user->delete();
根据主键删除一个模型
User::destroy(1);
User::destroy(array(1, 2, 3));
User::destroy(1, 2, 3);
当然,您可以在一组模型中运行删除查询:
$affectedRows = User::where('votes', '>', 100)->delete();
如果您希望简单的在一个模型中更新时间戳,可以使用 touch
函数:
只更新模型的时间戳
$user->touch();
软删除
当软删除一个模型,它并没有真的从数据库中删除。相反,一个 deleted_at
时间戳在记录中被设置。为一个模型开启软删除,在模型中指定 softDelete
属性:
class User extends Eloquent {
protected $softDelete = true;
}
为了在您的表中添加一个 deleted_at
字段,您可以在迁移中使用 softDeletes
函数:
$table->softDeletes();
现在,当您在一个模型中调用 delete
函数,deleted_at
字段将被设置为当前的时间戳。在使用软删除的模型中查询,被软删除的模型将不被包含进查询结果中。为了强制已删除的模型出现在结果集中,在查询中使用 withTrashed
函数:
强制软删除的模型到结果集中
$users = User::withTrashed()->where('account_id', 1)->get();
如果您希望在结果集中只包含软删除的模型,您可以使用 onlyTrashed
函数:
$users = User::onlyTrashed()->where('account_id', 1)->get();
恢复一个已被软删除的记录,使用 restore
函数:
$user->restore();
您也可以在查询中使用 restore
函数:
User::withTrashed()->where('account_id', 1)->restore();
restore
函数也可以在关系中被使用:
$user->posts()->restore();
如果您希望从数据库中真正删除一个模型,您可以使用 forceDelete
函数:
$user->forceDelete();
forceDelete
函数也可以在关系中被使用:
$user->posts()->forceDelete();
检测一个给定的模型实例是否被软删除,可以使用 trashed
函数:
if ($user->trashed())
{
//
}