多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 结果检索 ### [](https://octobercms.com/docs/database/query#retrieving-results)检索结果 #### 检索表中的所有行 要开始流利的查询,请使用外观`table`上的方法`Db`。该`table`方法为给定的表返回一个流畅的查询生成器实例,使您可以将更多约束链接到查询上,然后最终获得结果。在此示例中,让我们仅`get`查看表中的所有记录: ~~~ $users = Db::table('users')->get(); ~~~ 像[原始查询](https://octobercms.com/docs/database/basics#running-queries)一样,该`get`方法返回`array`结果的,其中每个结果都是PHP`stdClass`对象的实例。您可以通过将列作为对象的属性来访问来访问每个列的值: ~~~ foreach ($users as $user) { echo $user->name; } ~~~ #### 从表中检索单个行/列 如果只需要从数据库表中检索一行,则可以使用该`first`方法。此方法将返回一个`stdClass`对象: ~~~ $user = Db::table('users')->where('name', 'John')->first(); echo $user->name; ~~~ 如果您甚至不需要整行,都可以使用`value`方法从记录中提取单个值。此方法将直接返回列的值: ~~~ $email = Db::table('users')->where('name', 'John')->value('email'); ~~~ #### 检索列值列表 如果要检索包含单个列的值的数组,则可以使用该`lists`方法。在此示例中,我们将检索一组角色标题: ~~~ $titles = Db::table('roles')->lists('title'); foreach ($titles as $title) { echo $title; } ~~~ 您还可以为返回的数组指定一个自定义键列: ~~~ $roles = Db::table('roles')->lists('title', 'name'); foreach ($roles as $name => $title) { echo $title; } ~~~ ### [](https://octobercms.com/docs/database/query#chunking-results)分块结果 如果您需要处理数千个数据库记录,请考虑使用该`chunk`方法。此方法一次检索一个小的“块”结果,然后将每个块馈入`Closure`进行处理。该方法对于编写可处理数千条记录的[控制台命令](https://octobercms.com/docs/console/development)非常有用。例如,让我们`users`一次以100条记录的块来处理整个表: ~~~ Db::table('users')->chunk(100, function($users) { foreach ($users as $user) { // } }); ~~~ 您可以通过返回`false`来停止处理其他块`Closure`: ~~~ Db::table('users')->chunk(100, function($users) { // Process the records... return false; }); ~~~ 如果在对结果进行分块时更新数据库记录,则分块结果可能会以意想不到的方式更改。因此,在分块时更新记录时,最好总是使用该`chunkById`方法。此方法将基于记录的主键自动对结果进行分页: ~~~ Db::table('users')->where('active', false) ->chunkById(100, function ($users) { foreach ($users as $user) { Db::table('users') ->where('id', $user->id) ->update(['active' => true]); } }); ~~~ > **注意:**更新或删除块回调中的记录时,对主键或外键的任何更改都可能影响块查询。这可能导致记录未包含在分块结果中。 ### [](https://octobercms.com/docs/database/query#aggregates)骨料 查询生成器还提供了多种聚合方法,如`count`,`max`,`min`,`avg`,和`sum`。您可以在构造查询后调用以下任何一种方法: ~~~ $users = Db::table('users')->count(); $price = Db::table('orders')->max('price'); ~~~ 当然,您可以将这些方法与其他子句结合使用来构建查询: ~~~ $price = Db::table('orders') ->where('is_finalized', 1) ->avg('price'); ~~~ #### 确定记录是否存在 而不是使用的`count`方法,以确定是否有任何记录存在您搜索条件的限制,你可以使用`exists`和`doesntExist`方法: ~~~ return Db::table('orders')->where('finalized', 1)->exists(); return Db::table('orders')->where('finalized', 1)->doesntExist(); ~~~