Laravel Eloquent:获取随机的数据
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]);
});
高认可度评论:
@笑逐颜凯 慎用,还不如随机数 whereIn
SELECT
FROM
table
AS t1 JOIN (SELECT ROUND(RAND() ((SELECT MAX(id) FROMtable
)-(SELECT MIN(id) FROMtable
))+(SELECT MIN(id) FROMtable
)) AS id) AS t2WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
以前用过的,效率不错。
这样取的话 数据量大了 是不是会很慢呢?
框架是很利害 ,封装得太深。我想知道最低层的这条SQL是如何写的
@demon 就是
order by rand()
@笑逐颜凯 慎用,还不如随机数 whereIn
@yangxiaopeipei 那要是有筛选条件呢?就只能先找出这些id,然后去随机取id,找出对应数据?
正在寻求一个更好的随机取数据的方式
:satisfied: 放弃!
SELECT
FROM
table
AS t1 JOIN (SELECT ROUND(RAND() ((SELECT MAX(id) FROMtable
)-(SELECT MIN(id) FROMtable
))+(SELECT MIN(id) FROMtable
)) AS id) AS t2WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
以前用过的,效率不错。