ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 检索模型 ### [](https://octobercms.com/docs/database/model#retrieving-models)检索模型 从数据库请求数据时,模型将主要使用`get`或`first`方法检索值,具体取决于您是希望[检索多个模型](https://octobercms.com/docs/database/model#retrieving-multiple-models)还是[检索单个模型](https://octobercms.com/docs/database/model#retrieving-single-models)。从模型派生的查询返回[October \\ Rain \\ Database \\ Builder](https://octobercms.com/docs/api/october/rain/database/builder)的实例。 > **注意**:默认情况下,所有模型查询都[启用](https://octobercms.com/docs/database/query#in-memory-caching)了[内存中缓存](https://octobercms.com/docs/database/query#in-memory-caching)。尽管缓存在大多数情况下会自动使自身失效,但是`$model->reload()`对于更复杂的用例,有时您将需要使用该方法来刷新缓存。 ### [](https://octobercms.com/docs/database/model#retrieving-multiple-models)检索多个模型 创建模型[及其关联的数据库表之后](https://octobercms.com/docs/database/structure#migration-structure),就可以开始从数据库中检索数据了。将每个模型视为强大的[查询生成器,](https://octobercms.com/docs/database/query)使您可以查询与该模型关联的数据库表。例如: ~~~ $flights = Flight::all(); ~~~ #### [](https://octobercms.com/docs/database/model#accessing-column-values)访问列值 如果您有模型实例,则可以通过访问相应的属性来访问模型的列值。例如,让我们遍历`Flight`查询返回的每个实例,并回显该`name`列的值: ~~~ foreach ($flights as $flight) { echo $flight->name; } ~~~ #### [](https://octobercms.com/docs/database/model#adding-constraints)添加其他约束 该`all`方法将返回模型表中的所有结果。由于每个模型都充当[查询构建器](https://octobercms.com/docs/database/query),因此您还可以向查询添加约束,然后使用该`get`方法来检索结果: ~~~ $flights = Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); ~~~ > **注意:**由于模型是查询构建器,因此您应该熟悉[查询构建器](https://octobercms.com/docs/database/query)上可用的所有方法。您可以在模型查询中使用这些方法中的任何一种。 #### [](https://octobercms.com/docs/database/model#returning-collections)馆藏 对于`all`和`get`检索多个结果的方法,`Collection`将返回a的实例。此类提供[了各种有用的方法](https://octobercms.com/docs/database/collection)来处理结果。当然,您可以像数组一样简单地遍历此集合: ~~~ foreach ($flights as $flight) { echo $flight->name; } ~~~ #### [](https://octobercms.com/docs/database/model#chunking-results)分块结果 如果需要处理数千条记录,请使用`chunk`命令。该`chunk`方法将检索模型的“块”,将其馈给给定的模型`Closure`进行处理。使用`chunk`大型结果集时,使用该方法将节省内存: ~~~ Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } }); ~~~ 传递给该方法的第一个参数是每个“块”希望接收的记录数。从数据库中检索到的每个块都将调用作为第二个参数传递的Closure。 ### [](https://octobercms.com/docs/database/model#retrieving-single-models)检索单个模型 除了检索给定表的所有记录之外,您还可以使用`find`和检索单个记录`first`。这些方法返回一个模型实例,而不是返回模型集合: ~~~ // Retrieve a model by its primary key $flight = Flight::find(1); // Retrieve the first model matching the query constraints $flight = Flight::where('active', 1)->first(); ~~~ #### [](https://octobercms.com/docs/database/model#model-not-found-exception)找不到例外 有时,如果找不到模型,您可能希望抛出异常。这在路由或控制器中特别有用。该`findOrFail`和`firstOrFail`方法将检索查询的第一个结果。但是,如果未找到结果,`Illuminate\Database\Eloquent\ModelNotFoundException`将抛出: ~~~ $model = Flight::findOrFail(1); $model = Flight::where('legs', '>', 100)->firstOrFail(); ~~~ 当[开发一个API](https://octobercms.com/docs/services/router),如果异常没有被捕获,一个`404`HTTP响应被自动发送回用户,所以没有必要写明确检查返回`404`使用这些方法时的反应: ~~~ Route::get('/api/flights/{id}', function ($id) { return Flight::findOrFail($id); }); ~~~ ### [](https://octobercms.com/docs/database/model#retrieving-aggregates)检索聚合 您也可以使用`count`,`sum`,`max`,和其他[聚合函数](https://octobercms.com/docs/database/query#aggregates)通过查询器提供。这些方法返回适当的标量值,而不是完整的模型实例: ~~~ $count = Flight::where('active', 1)->count(); $max = Flight::where('active', 1)->max('price'); ~~~