创建模型 首先,创建一个 Eloquent 模型,生成的模型通常放在 app 目录中,但你可以通过 composer.json 随意地将它们放在可被自动加载的地方。所有的 Eloquent 模型都继承了 Illuminate\Database\Eloquent\Model 类。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 <?php namespace DriverTaskEditor\Models\Dao; use DriverTaskEditor\Core\Dao; use DriverTaskEditor\Common\Constant; class ActivityDao extends Dao { /** *(1)数据表名,必填 @var string */ protected $table = 'activity'; /** *(2)主键,可选 @var int * Eloquent 也会假定每个数据表都有一个名为 id 的主键字段。你可以定义一个受保护的 $primaryKey 属性来覆盖这个约定。 * Eloquent 假定主键是一个递增的整数值,这意味着在默认情况下主键会自动转换为 int。 如果使用的是非递增或者非数字的主键,则必须在模型上设置 public $incrementing = false。如果主键不是一个整数,则应该在模型上设置 protected $keyType = string */ /** *(3)要连接的数据库(database.php中的key),可选,默认'default',@var string */ protected $connection = 'driver_task'; /** * (4)必填:强转主键值类型; 使用toArray方法时,组件会根据主键自增类型,将主键类型转换为int; * 故需要通过$casts再转回string,有些模型有这个变量有些没有,@var array */ protected $casts = [ 'segments' => 'array', 'segment_conditions'=> 'array', 'cities' => 'array', 'status' => 'int', 'group_id' => 'int', 'trigger_type' => 'int', 'product_id' => 'int', 'product_line' => 'array', 'evaluate_info' => 'array', 'task_ids' => 'array', 'extra' => 'array', 'render_info' => 'array', ]; /** * (5)需要被转换成日期的属性。 * * @var array */ protected $dates = [ 'create_time', 'modify_time', ]; /** * (6)列表中的字段不可被批量赋值(create方法创建时不会写入该字段) * $guarded和$fillable 二选一,一个表示黑名单,一个表示白名单 * @var array */ protected $guarded = ['id']; /** * (7)该模型是否被自动维护时间戳,可选,@var bool,默认为true * Eloquent 会默认数据表中存在 created_at 和 updated_at这两个字段,如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false */ /** * (8)如果需要自定义用于存储时间戳的字段名,可在模型中通过设置 CREATED_AT 和 UPDATED_AT 常量来实现: * 更新时间和修改时间的字段,如果没有则设置public $timestamps = false; */ const CREATED_AT = 'create_time'; const UPDATED_AT = 'modify_time'; }
查询 检索多个模型 Eloquent 的 all 方法会返回模型表中所有的结果。
1 2 3 4 5 6 7 8 9 <?php use App\Flight; $flights = App\Flight::all(); foreach ($flights as $flight) { echo $flight->name; }
由于每个 Eloquent 模型都可以当作一个 查询构造器,因此你还可以在查询中添加约束,然后使用 get 方法来获取结果:
1 2 3 4 $flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();
注意: Eloquent 模型是查询构造器,因此你应当去阅读 查询构造器 提供的所有方法,以便你可以在 Eloquent 查询中使用。
集合 1、分块结果:如果需要处理数千个 Eloquent 记录,可以使用 chunk 命令。chunk 方法会检索 Eloquent 模型的「分块」,将它们提供给指定的 Closure 进行处理。在处理大型结果集时,使用 chunk 方法可节省内存:
1 2 3 4 Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // }
注意:传递到方法的第一个参数是希望每个「分块」接收的数据量。闭包则被作为第二个参数传递,它会在每次执行数据库查询传递每个块时被调用。
2、使用游标:cursor 允许你使用游标来遍历数据库数据,该游标只执行一个查询。处理大量数据时,可以使用 cursor 方法可以大幅度减少内存的使用量:
1 2 3 foreach (Flight::where('foo', 'bar')->cursor() as $flight) { // }
检索单个模型/集合 除了从指定的数据表检索所有记录外,你也可以通过 find 或 first 方法来检索单条记录。这些方法不是返回一组模型,而是返回一个模型实例:
1 2 3 4 5 // 通过主键取回一个模型... $flight = App\Flight::find(1); // 取回符合查询限制的第一个模型 ... $flight = App\Flight::where('active', 1)->first();
你也可以用主键数组为参数调用 find 方法,它将返回匹配记录的集合:
1 $flights = App\Flight::find([1, 2, 3]);
「找不到」异常 如果你希望在找不到模型时抛出异常,可以使用 findOrFail 以及 firstOrFail 方法。这些方法会检索查询的第一个结果。如果没有找到相应结果,就会抛出一个
1 2 3 4 5 Illuminate\Database\Eloquent\ModelNotFoundException: $model = App\Flight::findOrFail(1); $model = App\Flight::where('legs', '>', 100)->firstOrFail();
如果没有对异常进行捕获,则会自动返回 HTTP 404 响应给用户。也就是说,在使用这些方法时,不需要另外写个检查来返回 404 响应:
1 2 3 Route::get('/api/flights/{id}', function ($id) { return App\Flight::findOrFail($id); });
你还可以使用 查询构造器 提供的 count、sum、max 以及其它 聚合函数。这些方法只会返回适当的标量值而不是整个模型实例:
1 2 3 $count = App\Flight::where('active', 1)->count(); $max = App\Flight::where('active', 1)->max('price');
插入和更新模型 1、save方法插入新数据。 要在数据库中创建新记录,只需创建一个新的模型实例,并在模型上设置属性,然后调用 save 方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 //插入 $flight = new Flight; $flight->name = $request->name; $flight->save(); $flight = App\Flight::create(['name' => 'Flight 10']); //如果你已经有一个模型实例,你可以传递数组给 fill 方法: $flight->fill(['name' => 'Flight 22']); /* * 其他创建方法 */ // 通过 name 属性检索航班,当结果不存在时创建它... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']); // 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它 $flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] ); // 通过 name 属性检索航班,当结果不存在时实例化... $flight = App\Flight::firstOrNew(['name' => 'Flight 10']); // 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化 $flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] ); //updateOrCreate // 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元 // 如果不存在匹配的模型就创建一个 $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] );
2、更新
1 2 3 4 5 //批量插入,update 方法需要传入表示要更新的字段的字段的值的键值对数组。 App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);
3、删除
可以在模型实例上调用 delete 方法来删除模型:
1 2 3 4 5 6 7 8 9 10 11 12 //通过主键删除 $flight = App\Flight::find(1); $flight->delete(); //如果你已知道了这个模型的主键,则可以直接调用 destroy 方法删除它: App\Flight::destroy(1); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(1, 2, 3); //通过查询删除模型 $deletedRows = App\Flight::where('active', 0)->delete(); //注意:使用 Eloquent 执行批量删除语句时,deleting 和 deleted 模型事件不会为已删除的模型触发。因为在执行删除语句时,不会检索模型实例。
参考: Eloquent: 入门
转载请注明:本文档由 Laravel China 社区 laravel-china.org 组织翻译,详见 翻译召集帖。