读laravel手册——Eloquent模型笔记1
默认的约定
一个Flight模型类,将会从flights数据表中检索和存储信息
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
}
数据表名称 $table
如果没有指定,则默认使用类的复数形式作为表名.这是可以修改的:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//
protected $table = 'my_flights';
}
数据表主键 $primaryKey
如果没有指定,Eloquent假定每一个数据表都有一个名为id的主键字段,并且假定主键是一个递增的整数值。如果使用的是非递增或者非数字的主键,则必须在模型上设置 public $incrementing = false。如果主键不是一个整数,则应该在模型上设置 protected $keyType = string。
时间戳
Eloquent 会默认数据表中存在 created_at 和 updated_at 这两个字段。如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false.时间戳在数据库中的存储方式可以由$dataFormat字段定义
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* 该模型是否被自动维护时间戳
*
* @var bool
*/
public $timestamps = false;
}
更改数据库连接
修改protected $connection 字段:
protected $connection = 'connection-name';
检索
Eloquent模型是一个强大的查询构造器,它让你可以流畅地查询与该模型相关联的数据库表。Eloquent 的 all 方法会返回模型表中所有的结果。由于每个 Eloquent 模型都可以当作一个 查询构造器,因此你还可以在查询中添加约束,然后使用 get 方法来获取结果.两个例子
<?php
use App\Flight;
$flights = App\Flight::all();
foreach ($flights as $flight) {
echo $flight->name;
}
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
查询构造器能用的检索,这都能用.
集合——Collection
使用 Eloquent 中的方法比如 all 和 get 可以检索多个结果,并且会返回一个 Illuminate\Database\Eloquent\Collection 实例。Collection 类提供了 很多辅助函数 来处理Eloquent 结果:
$flights = $flights->reject(function ($flight) {
return $flight->cancelled;
});
也可以像数组一样遍历集合:
foreach ($flights as $flight) {
echo $flight->name;
}
插入
要在数据库中创建新记录,只需创建一个新的模型实例,并在模型上设置属性,然后调用 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)
{
// 验证请求...
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
}
}
在这个例子中,我们把来自 HTTP 请求中的 name 参数简单地指定给 App\Flight 模型实例的 name 属性。当我们调用 save 方法时,就会添加一条记录到数据库中。created_at 以及 updated_at 时间戳将在 save 方法被调用时会被自动设置,因此我们不需要去手动设置它们。
更新
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();
批量更新
不过,在这之前,你需要先在你的模型上指定 fillable 或 guarded 的属性,因为所有的 Eloquent 模型在默认情况下都不能进行批量赋值。
当用户通过 HTTP 请求传入了一个意料之外的参数,并且该参数更改了数据库中你并不打算要更改的字段时,就会发生批量赋值漏洞。例如,恶意用户可能会通过 HTTP 请求发送 is_admin 参数,然后将其传递到模型的 create 方法中,此操作能让该用户把自己升级为管理者。
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();