Vous pouvez résoudre ce problème en utilisant DB::statement
, DB:raw
et DB::select
.
Le code est testé sur mon environnement de test Laravel 5.0 et il fonctionne parfaitement.
Votre instruction mysql est également testée, elle fonctionne parfaitement sur la console MySQL.
Voici le code :
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;
")
);
Afficher les résultats
echo "utilizador_id | nome <br />";
foreach ($results as $result)
{
echo $result->utilizador_id . "__________| " . $result->nome . "<br />";
}
Rappelez-vous pour ajouter use DB;
après l'espace de nom :
<?php
namespace App\Http\Controllers;
use DB;
J'ai créé Afficher le code des résultats uniquement pour montrer tous les résultats, mais c'est à vous de décider comment manipuler les données dans votre code.
Résultats des tests
Résultats aléatoires de votre instruction mysql dans la console MySQL
Résultats aléatoires de votre instruction mysql dans Laravel
Remarque :
1- J'ai résolu cette question moi-même pour vous mais j'ai rencontré un petit problème et j'ai reçu des commentaires de Kryptonit3 sur le forum Laracast.
2- Vous pourriez trouver d'autres solutions à cette question ou elle peut être résolue de différentes manières, mais j'ai choisi de résoudre de cette façon.
La question et la réponse complètes dans la note 1 sont disponibles ici .