首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Laravel雄辩的whereIn按给定顺序返回

Laravel 的 Eloquent ORM 提供了一个方便的方法 whereIn 来查询符合多个值的记录。然而,whereIn 方法默认不会按照提供的值的顺序返回结果。如果你需要按照给定的顺序返回结果,你可以使用 orderByRaw 方法结合 SQL 的 FIELD 函数来实现。

基础概念

whereIn 方法用于筛选字段值在给定数组中的记录。orderByRaw 方法允许你执行原始的 SQL 排序语句。FIELD 函数是 MySQL 的一个函数,它可以用来按照指定的顺序排序。

相关优势

  • 灵活性:可以按照任意给定的顺序返回结果。
  • 简洁性:通过 Eloquent 方法链式调用,代码简洁易读。

类型

这是一个查询构建器的方法,适用于 Eloquent ORM。

应用场景

当你需要根据一组特定的 ID 或其他字段值获取记录,并且需要这些记录按照特定的顺序排列时,这个方法非常有用。

示例代码

假设我们有一个 users 表,我们想要根据一组特定的 ID 获取用户,并且按照这些 ID 的顺序返回结果:

代码语言:txt
复制
use App\Models\User;

$ids = [3, 1, 2]; // 给定的 ID 顺序
$users = User::whereIn('id', $ids)
            ->orderByRaw("FIELD(id, " . implode(',', $ids) . ")")
            ->get();

在这个例子中,$users 将会首先包含 ID 为 3 的用户,然后是 ID 为 1 的用户,最后是 ID 为 2 的用户。

遇到的问题及解决方法

如果你遇到了 whereIn 不按预期顺序返回结果的问题,确保你使用了 orderByRaw 方法,并且正确地构造了 FIELD 函数的参数。如果你的数据库不是 MySQL 或者不支持 FIELD 函数,你需要使用其他方法来实现排序。

例如,在 PostgreSQL 中,你可以使用 CASE 语句来实现类似的排序:

代码语言:txt
复制
$users = User::whereIn('id', $ids)
            ->orderByRaw("CASE id " . implode(" ", array_map(function($id) {
                return "WHEN $id THEN " . array_search($id, $ids);
            }, $ids)) . " END")
            ->get();

这段代码将为每个 ID 创建一个 CASE 语句,当 ID 匹配时返回其在 $ids 数组中的索引,然后根据这个索引进行排序。

总结

通过结合 whereInorderByRaw 方法,你可以确保查询结果按照给定的顺序返回。这种方法在不同的数据库系统中可能需要不同的实现方式,但基本思路是相似的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++返回指针值的函数 | 按字母顺序由小到大输出

C++指向函数的指针作函数参数 学到这里的读者应该知道在C语言中,函数指针变量常见的用途之一是作为函数的参数,将函数名传给其他函数的形参,这样可以在调用一个函数的过程中根据给定的不同实参调用不同的函数,...C++返回指针值的函数 在C++中,一个函数可以带回一个整型值、字符值、实型值 等,也可以带回指针型的数据,即地址,带回的值的类型是指针类型,返回指针值的函数简称为指针函数。 ...经典案例:C++实现若干字符串按字母顺序由小到大输出。...number=5;//定义整型变量    sort(name,number);//调用sort函数    print(name,number);//调用print函数    return 0; //函数返回值为...C++返回指针值的函数 | 按字母顺序由小到大输出 更多案例可以go公众号:C语言入门到精通

1.5K2118
  • Laravel拼装SQL子查询的最佳实现

    大家注意那个 IN 子句,其实是一个查询结果集,从另个表返回的。 写SQL真的很伤神,不如用框架自带的orm,操作起来非常人性化,拼装也很简单。那就抛出一个问题,Laravel如何实现上述的子查询?...对Laravel来说,简直不要太简单,你只要在写whereIn的时候,将数组使用闭包返回就可以了。...->get(); 然后我们需要定制的 array,用于包裹返回值数据,那么直接用闭包就是。...写在最后 本文通过一个SQL语句查询在Laravel中的实现方式,解释了laravel在拼装SQL查询时的自由度,使用起来非常灵活。...对于固定的查询方式,或者经过优化的SQL语句,你大可直接发送给Laravel直接运行以便提高效率。

    3.8K10

    Excel公式练习44: 从多列中返回唯一且按字母顺序排列的列表

    本次的练习是:如下图1所示,单元格区域A2:E5中包含一系列值和空单元格,其中有重复值,要求从该单元格区域中生成按字母顺序排列的不重复值列表,如图1中G列所示。 ?...在单元格G1的主公式中: =IF(ROWS($1:1)>$H$1,"", 如果公式向下拖拉的行数超过单元格H1中的数值6,则返回空值。 3....Range1,""",COUNTIF(Range1,"<"&Arry4)),0)) 实际上,这是提取唯一且按字母顺序排列的值的标准公式构造...:上述数组中非零值的位置表示在该区域内每个不同值在该数组中的首次出现,因此提供了一种仅返回唯一值的方法。...强制INDEX返回数组。 4. 确定字母排序。 5. 提取唯一值并按字母排序。

    4.2K31

    laravel 学习之路 数据库操作 查询数据

    运行 Select 查询 你可以使用 DB Facade 的 select 方法来运行基础的查询语句我们在上面创建的路由里增加个 index 的路由 dump 是 laravel 的打印函数可以把它理解为...select 方法将始终返回一个数组,数组中的每个结果都是一个 StdClass 对象,可以像下面这样访问结果值 function index() { $data = DB...它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。 Laravel 的查询构造器使用 PDO参数绑定来保护您的应用程序免受 SQL 注入攻击。...laravel 中就是 whereIn() 第一个参数还是字段名第二个参数是数组 function getList() { $data = DB::table('test'...当然 还可以将 test 表里 title 字段作为键名,describe 字段作为键值 返回 function getPluck(){ $titles = DB::table(

    3.2K20

    给一非空的单词列表,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序,如果不同的单词有相同出现频率,按字母顺序排序。

    题目要求 给一非空的单词列表,返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。...i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2 输出: [“i”, “love”] 解析: “i” 和 “love” 为出现次数最多的两个单词...注意,按字母顺序 “i” 在 “love” 之前。...”, “is”, “is”], k = 4 输出: [“the”, “is”, “sunny”, “day”] 解析: “the”, “is”, “sunny” 和 “day” 是出现次数最多的四个单词...} } public List topKFrequent(String[] words, int k) { //1.先统计每个单词出现的个数

    1.7K30

    基于 Redis 有序集合实现热门浏览文章排行榜

    今天我们以 Laravel 项目热门浏览文章排行榜为例进行实战演示。 准备模型类和数据表 开始之前,我们先创建文章表、模型类和控制器: ?...我们限定排行榜的大小是 10,即只显示浏览量最多的前十篇文章,这可以通过 ZREVRANGE 指令实现,对应到 Laravel 代码,我们需要在 PostController 中新增一个 popular...ID 排序一致 $posts = Post::whereIn('id', $postIds) ->select(['id', 'title', 'views'])...、元素区间,由于集合中存储的元素是文章 ID,所以对于返回的结果,还需要再次到数据库中去查询完整的文章记录,此外,我们还要按照传入的 ID 顺序对返回结果进行排序,否则数据库查询返回的结果顺序又变成基于...$postId); $this->info($response->body()); } } } 这里我们使用了 Laravel 自带的 HTTP 客户端发起对

    1.8K40

    泛微OA地址外发自定义接口、MySQL操作、Laravel入门

    前言 泛微OA使用的Laravel 这是其对接数据库的文档 https://laravelacademy.org/post/22012 位置 项目位置 D:\e-office_server_11.0\..., [1, '学院君']); 运行更新语句 update 方法用于更新数据库中已存在的记录,该方法返回受更新语句影响的行数: $affected = DB::update('update users set..., ['学院君']); 运行删除语句 delete 方法用于删除数据库中已存在的记录,和 update 一样,该语句返回被删除的行数: $deleted = DB::delete('delete from.../whereNotIn/orWhereIn/orWhereNotIn whereIn 方法验证给定列的值是否在给定数组中: $users = DB::table('users')...->whereIn('id', [1, 2, 3]) ->get(); whereNotIn 方法验证给定列的值不在给定数组中: $users = DB::table('users

    2K30

    通过 Laravel 查询构建器实现复杂的查询语句

    查询小技巧 我们首先来介绍几个 Laravel 自带的语法糖,可以帮助我们快速获取期望的查询结果,提高编码效率。...IN 查询可以通过 whereIn 方法来实现: DB::table('posts')->whereIn('user_id', [1, 3, 5, 7, 9])->get(); 对应的 WHERE 子句是...使用该方法时,需要注意传递给 whereIn 的第二个参数不能是空数组,否则会报错。 同样,与之相对的,还有一个 whereNotIn 方法,表示与 whereIn 相反的查询条件。...将上述代码中的 whereIn 方法改为 whereNotIn,对应的查询子句就是 where user_id not in (1, 3, 5, 7, 9)。...where 条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,如果带 where,返回的是匹配的行数。

    30.2K20

    laravel-nestedset:多级无限分类正确姿势

    嵌套集合模型 安装要求 PHP>=5.4 laravel>=4.1 v4.3版本以后支持Laravel-5.5 v4版本支持Laravel-5.2、5.3、5.4 v3版本支持Laravel-5.1 v2...版本支持Laravel-4 强烈建议使用支持事物功能的数据引擎(像MySql的innoDb)来防止可能的数据损坏。...对于v4.2.0版本不是自动开启transaction的,另外node的结构化操作需要在模型上手动执行save,但是有些方法会隐性执行save并返回操作后的布尔类型的结果。...', '=', 1)->get(); 注意 这在数据库严格模式下无效 默认排序 所有的节点都是在内部严格组织的,默认情况下没有顺序,所以节点是随机展现的,这部影响展现,你可以按字母和其他的顺序对节点排序...但是在一些情况下按层级展示是必要的,它对获取祖先和用于菜单顺序有用。

    3.5K20

    跟我一起学Laravel-数据库操作和查询构造器

    使用sql语句执行插入 基本插入操作 更新操作 使用sql语句执行更新操作 基本更新操作 指定列的增减 删除操作 使用sql执行删除 基本删除操作 悲观锁 事务处理 查看日志记录 其它操作 在Laravel...,该方法返回的是一个stdClass对象 $user = DB::table('users')->where('name', 'John')->first(); echo $user->name; 如果只需要一列的值...后,会返回 操作影响的数据行数 DB::update('update users set votes = 100 where name = ?'...后,会返回 操作影响的数据行数 DB::delete('delete from users'); 基本删除操作 DB::table('users')->delete(); DB::table('users...); 这样不管什么操作都可以做了吧 另外含有两个方法,用于重新连接到指定数据库和断开连接 DB::reconnect('foo'); DB::disconnect('foo')d; ---- 参考: Laravel

    6.3K30

    Laravel 表单 size 验证数字

    要验证一个数字的确定值,看了表单验证文档 size:value验证的字段必须具有与给定值匹配的大小。对于字符串来说,value 对应于字符数。对于数字来说,value 对应于给定的整数值。...9 是整数,他就会直接按数字的方式验证,结果直接打印了错误消息The age must be 9 characters.这个错误消息很明显的是提示字符串长度的, 然后看了一下才发现还需要加上一个条件...($attribute, $rule); Laravel 前面这些是过滤,验证文件上传的 Laravel 这里动态拼接了一个方法,通过打印得知是validateSize Laravel 然后在这个类用的...trait 中找到这个方法ValidatesAttributes::validateSize Laravel 其实这里已经可以看到验证$hasNumeric Laravel $hasNumeric里放的是这个...Laravel 再看一下他是如何验证的 Laravel Laravel 如果没有numeric或者integer会返回 null,就会导致$hasNumeric等于 false Laravel

    16910
    领券