Laravel Eloquent:获取随机的数据 0 个改进

Laravel >= 5.2 可以使用:

User::inRandomOrder()->get();

或者随机读取一条信息:

User::inRandomOrder()->first();

请注意以下的这种查询方式只能支持 MySQL 数据库:

User::orderByRaw("RAND()")->get();

如果你自己要实现类似于 inRandomOrder 的功能,并支持不同的数据库驱动,可以参考以下:

use Illuminate\Database\Query\Builder;

Builder::macro('orderByRandom', function () {

    $randomFunctions = [
        'mysql'  => 'RAND()',
        'pgsql'  => 'RANDOM()',
        'sqlite' => 'RANDOM()',
        'sqlsrv' => 'NEWID()',
    ];

    $driver = $this->getConnection()->getDriverName();

    return $this->orderByRaw($randomFunctions[$driver]);
});
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 7

@笑逐颜凯 慎用,还不如随机数 whereIn

5年前 评论

SELECT
FROM table AS t1 JOIN (SELECT ROUND(RAND()
((SELECT MAX(id) FROM table)-(SELECT MIN(id) FROM table))+(SELECT MIN(id) FROM table)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
以前用过的,效率不错。

5年前 评论

这样取的话 数据量大了 是不是会很慢呢?

5年前 评论

框架是很利害 ,封装得太深。我想知道最低层的这条SQL是如何写的

5年前 评论
sushengbuhuo

@demon 就是 order by rand()

5年前 评论

@笑逐颜凯 慎用,还不如随机数 whereIn

5年前 评论

@yangxiaopeipei 那要是有筛选条件呢?就只能先找出这些id,然后去随机取id,找出对应数据?
正在寻求一个更好的随机取数据的方式

5年前 评论
panda-sir

:satisfied: 放弃!

5年前 评论

SELECT
FROM table AS t1 JOIN (SELECT ROUND(RAND()
((SELECT MAX(id) FROM table)-(SELECT MIN(id) FROM table))+(SELECT MIN(id) FROM table)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
以前用过的,效率不错。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!