Navigation

Laravel

How to Order Results Randomly with `inRandomOrder()`

Randomize Laravel query results in 2025 using inRandomOrder() for featured content, A/B testing, and varied user experiences. Avoid predictable content patterns.

Table Of Contents

Quick Fix: Break the Monotony

Tired of showing the same "latest posts" to every visitor? Random ordering creates engaging, varied experiences:

// Boring - Always shows newest posts first
$posts = Post::orderBy('created_at', 'desc')->take(5)->get();

// Engaging - Different posts every time
$randomPosts = Post::inRandomOrder()->take(5)->get();

// Featured products carousel that changes each visit
$featuredProducts = Product::where('featured', true)
    ->inRandomOrder()
    ->take(8)
    ->get();

// Random testimonials for social proof
$testimonials = Testimonial::where('approved', true)
    ->inRandomOrder()
    ->take(3)
    ->get();

Laravel Random Ordering Strategies

Different approaches for various randomization needs:

// Basic random selection
$randomUsers = User::inRandomOrder()->limit(10)->get();

// Random with conditions
$randomActiveProducts = Product::where('active', true)
    ->where('stock', '>', 0)
    ->inRandomOrder()
    ->take(6)
    ->get();

// Seeded randomization for consistent results per user
$userId = auth()->id();
$userSpecificRandom = Post::inRandomOrder($userId) // Laravel 8+
    ->take(5)
    ->get();

// Weighted randomization using raw SQL
$weightedProducts = Product::select('*')
    ->whereRaw('RAND() * weight > 0.5') // Products with higher weight appear more
    ->inRandomOrder()
    ->take(10)
    ->get();

// Performance-optimized random for large tables
$fastRandom = Product::select('*')
    ->where('id', '>=', DB::raw('FLOOR(1 + RAND() * (SELECT MAX(id) FROM products))'))
    ->take(1)
    ->first();

Advanced Random Selection Patterns

Handle complex randomization scenarios and performance optimization:

// A/B Testing - Random feature flags
public function getRandomFeatureVariant($userId)
{
    // Consistent randomization per user
    srand($userId); // Seed based on user ID
    $variants = ['control', 'variant_a', 'variant_b'];
    return $variants[array_rand($variants)];
}

// Recommendation system - Random from top-rated
$recommendedProducts = Product::where('rating', '>=', 4)
    ->whereNotIn('id', $userViewedProducts)
    ->inRandomOrder()
    ->take(5)
    ->get();

// Daily deals - One random deal per day
$todaysDeal = Product::where('can_be_deal', true)
    ->inRandomOrder(now()->format('Ymd')) // Same seed for entire day
    ->first();

// Quiz questions - Random order to prevent cheating
$quizQuestions = Question::where('quiz_id', $quizId)
    ->inRandomOrder()
    ->with('answers' => function ($query) {
        $query->inRandomOrder(); // Randomize answer order too
    })
    ->get();

// Geographic randomization - Random venues near user
$nearbyVenues = Venue::select('*')
    ->selectRaw('( 3959 * acos( cos( radians(?) ) * cos( radians( latitude ) ) 
        * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) 
        * sin( radians( latitude ) ) ) ) AS distance', [$lat, $lng, $lat])
    ->having('distance', '<', 25) // Within 25 miles
    ->inRandomOrder()
    ->take(8)
    ->get();

// Performance consideration for very large tables
class RandomizedContentService
{
    public function getRandomPosts($count = 5)
    {
        // Method 1: Good for small-medium tables
        return Post::published()->inRandomOrder()->take($count)->get();
    }
    
    public function getRandomPostsOptimized($count = 5)
    {
        // Method 2: Better for large tables
        $maxId = Post::published()->max('id');
        $minId = Post::published()->min('id');
        
        $randomIds = collect(range(1, $count * 3)) // Get more than needed
            ->map(fn() => rand($minId, $maxId))
            ->unique()
            ->take($count);
            
        return Post::published()
            ->whereIn('id', $randomIds)
            ->get()
            ->random($count); // Final randomization
    }
    
    public function getCachedRandomContent($cacheKey, $minutes = 15)
    {
        return Cache::remember($cacheKey, $minutes * 60, function () {
            return Post::published()->inRandomOrder()->take(10)->get();
        });
    }
}

// Prevent duplicate random selections
$excludeIds = session('viewed_products', []);
$randomProducts = Product::where('active', true)
    ->whereNotIn('id', $excludeIds)
    ->inRandomOrder()
    ->take(4)
    ->get();

// Store viewed IDs to avoid showing again
session()->push('viewed_products', ...$randomProducts->pluck('id'));

// Limit session array size
$viewedIds = collect(session('viewed_products', []))->take(50)->all();
session(['viewed_products' => $viewedIds]);

The inRandomOrder() method uses database-level randomization (ORDER BY RAND() in MySQL), which can be slow on large tables. For high-traffic applications, consider caching random results or using more efficient randomization techniques like selecting random IDs first, then fetching those records.

Related: Laravel Collections: Beyond Basic Array Operations | Laravel Events and Listeners: Building Decoupled Applications | Building Multi-tenant Applications with Laravel: A Comprehensive Guide

Share this article

Add Comment

No comments yet. Be the first to comment!

More from Laravel