企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 查询连贯操作 ### 介绍 数据库查询构建器为创建和运行数据库查询提供了方便,流畅的界面。它可用于在应用程序中执行大多数数据库操作,并且可在所有受支持的数据库系统上工作。 > **注意:**查询构建器使用PDO参数绑定来保护您的应用程序免受SQL注入攻击。无需清除作为绑定传递的字符串。 ### [](https://octobercms.com/docs/database/query#joins)添加 #### 内部加入声明 查询构建器还可以用于编写连接语句。要执行基本的SQL“内部联接”,可以`join`在查询构建器实例上使用该方法。传递给该`join`方法的第一个参数是您需要连接到的表的名称,其余参数指定连接的列约束。当然,如您所见,您可以在单个查询中联接多个表: ~~~ $users = Db::table('users') ->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get(); ~~~ #### 左联接/右联接语句 如果要执行“左连接”或“右连接”而不是“内部连接”,请使用`leftJoin`或`rightJoin`方法。该`leftJoin`和`rightJoin`方法具有相同签名的`join`方法: ~~~ $users = Db::table('users') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->get(); $users = Db::table('users') ->rightJoin('posts', 'users.id', '=', 'posts.user_id') ->get(); ~~~ #### 交叉加入声明 要执行“交叉连接”,请使用`crossJoin`要交叉连接到的表的名称的方法。交叉联接在第一个表和联接的表之间生成笛卡尔乘积: ~~~ $users = Db::table('sizes') ->crossJoin('colors') ->get(); ~~~ #### 高级联接语句 您也可以指定更高级的连接子句。首先,将a`Closure`作为第二个参数传递给`join`方法。该`Closure`会收到一个`JoinClause`对象,它允许你指定的约束`join`条款: ~~~ Db::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...); }) ->get(); ~~~ 如果要在联接上使用“ where”样式子句,则可以在联接上使用`where`和`orWhere`方法。这些方法将比较列和一个值,而不是比较两个列: ~~~ Db::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id') ->where('contacts.user_id', '>', 5); }) ->get(); ~~~ #### 子查询联接 您可以使用`joinSub`,`leftJoinSub`和`rightJoinSub`方法加入查询的子查询。这些方法中的每一个都接收三个参数:子查询,其表别名和定义相关列的Closure: ~~~ $latestPosts = Db::table('posts') ->select('user_id', Db::raw('MAX(created_at) as last_post_created_at')) ->where('is_published', true) ->groupBy('user_id'); $users = Db::table('users') ->joinSub($latestPosts, 'latest_posts', function ($join) { $join->on('users.id', '=', 'latest_posts.user_id'); })->get(); ~~~ ### [](https://octobercms.com/docs/database/query#unions)工会 查询构建器还提供了一种将两个查询“联合”在一起的快速方法。例如,您可以创建一个初始查询,然后使用该`union`方法将其与第二个查询合并: ~~~ $first = Db::table('users') ->whereNull('first_name'); $users = Db::table('users') ->whereNull('last_name') ->union($first) ->get(); ~~~ 该`unionAll`方法也可用,并且具有与相同的方法签名`union`。 ### [](https://octobercms.com/docs/database/query#deletes)删除内容 查询构建器还可用于通过以下`delete`方法从表中删除记录: ~~~ Db::table('users')->delete(); ~~~ 您可以`delete`通过`where`在调用`delete`方法之前添加子句来约束语句: ~~~ Db::table('users')->where('votes', '<', 100)->delete(); ~~~ 如果您希望截断整个表,这将删除所有行并将自动递增ID重置为零,则可以使用以下`truncate`方法: ~~~ Db::table('users')->truncate(); ~~~ ### [](https://octobercms.com/docs/database/query#pessimistic-locking)悲观锁定 查询构建器还包括一些函数来帮助您对`select`语句执行“悲观锁定”。要使用“共享锁”运行语句,可以`sharedLock`在查询中使用该方法。共享锁可防止在事务提交之前修改选定的行: ~~~ Db::table('users')->where('votes', '>', 100)->sharedLock()->get(); ~~~ 或者,您可以使用该`lockForUpdate`方法。“用于更新”锁可防止修改行或使用另一个共享锁选择行: ~~~ Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get(); ~~~ ### [](https://octobercms.com/docs/database/query#caching-queries)缓存查询 ### [](https://octobercms.com/docs/database/query#persistent-caching)持久缓存 您可以使用“[缓存”服务](https://octobercms.com/docs/services/cache)轻松地缓存查询结果。在准备查询时,只需链接`remember`or`rememberForever`方法。 ~~~ $users = Db::table('users')->remember(10)->get(); ~~~ 在此示例中,查询结果将被缓存十分钟。缓存结果时,将不会对数据库运行查询,并且将从为应用程序指定的默认缓存驱动程序中加载结果。 ### [](https://octobercms.com/docs/database/query#in-memory-caching)内存中缓存 通过使用内存中缓存,可以防止在同一请求中出现重复查询。默认情况下,此功能对[由模型准备的查询](https://octobercms.com/docs/database/model#retrieving-models)启用,但不对使用`Db`外观直接生成的[查询](https://octobercms.com/docs/database/model#retrieving-models)启用。 ~~~ Db::table('users')->get(); // Result from database Db::table('users')->get(); // Result from database Model::all(); // Result from database Model::all(); // Result from in-memory cache ~~~ 您可以使用`enableDuplicateCache`或`disableDuplicateCache`方法启用或禁用重复缓存。 ~~~ Db::table('users')->enableDuplicateCache()->get(); ~~~ 如果查询存储在缓存中,则在使用插入,更新,删除或截断语句时将自动清除查询。但是,您可以使用该`flushDuplicateCache`方法手动清除缓存。 ~~~ Db::flushDuplicateCache(); ~~~ > **注意**:通过命令行界面(CLI)运行时,将完全禁用内存中缓存。 ### [](https://octobercms.com/docs/database/query#debugging)调试 您可以在构建查询时使用`dd`或`dump`方法来转储查询绑定和SQL。该`dd`方法将显示调试信息,然后停止执行请求。该`dump`方法将显示调试信息,但允许请求继续执行: ~~~ Db::table('users')->where('votes', '>', 100)->dd(); Db::table('users')->where('votes', '>', 100)->dump(); ~~~