Você pode resolver isso usando
DB::statement
, DB:raw
e DB::select
. O código é testado no meu ambiente de teste Laravel 5.0 e funciona perfeitamente.
Sua instrução mysql também é testada e funciona perfeitamente no console MySQL.
Aqui está o código:
DB::statement(DB::raw('SET @prev=0,@rownum=0'));
$results =
DB::select(
DB::raw("
SELECT utilizador_id, nome
FROM (
SELECT *,
IF( @prev <> utilizador_id,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := utilizador_id,
@rownum
FROM (
SELECT * FROM `anuncios`
ORDER BY utilizador_id, rand()
) AS random_ads
) AS ads_ranked
WHERE rank <= 2;
")
);
Ver resultados
echo "utilizador_id | nome <br />";
foreach ($results as $result)
{
echo $result->utilizador_id . "__________| " . $result->nome . "<br />";
}
Lembre-se para adicionar
use DB;
após o espaço de nomes:<?php
namespace App\Http\Controllers;
use DB;
Eu fiz o código View results apenas para demonstrar todas as saídas de resultados, mas depende de você como manipular os dados em seu código.
Resultados do teste
Resultados aleatórios de sua instrução mysql no console MySQL
Resultados aleatórios de sua instrução mysql no Laravel
Observação:
1- Eu mesmo resolvi essa questão para você, mas enfrentei um pequeno problema e recebi informações do Kryptonit3 no fórum Laracast.
2- Você pode encontrar outras soluções para esta questão ou pode ser resolvida de maneiras diferentes, mas optei por resolver desta forma.
A pergunta e a resposta completas na Nota 1 podem ser encontradas aqui .