2017-08-25 3 views
1

Apprentissage eloquent/laravel. J'ai une collection:Laravel 5.4 Eloquent obtenir x enregistrements aléatoires de la collection où la propriété est nulle

$regions = Region::with('neighbors') 
    ->join('cards', 'cards.id', '=', 'regions.risk_card_id') 
    ->get(); 

J'ai une valeur ou les lignes:

$regionsPerUser = 8; 

Je fais cela pour tirer des documents au hasard:

$regions = $regions->random($regionsPerUser); 

Mais je dois filtrer cette sélection où $regions->user_id n'est pas nulle.

Existe-t-il un moyen de filtrer l'appel aléatoire dans le cadre du chaînage?

J'ai essayé ce qui ne fonctionne pas:

$regions = $regions->whereNotNull('user_id')->random($regionsPerUser); 

Et je me demande s'il y a une façon de le faire d'une manière ordonnée ceci dans une déclaration en chaîne plutôt que d'aller sur le chemin du filtre/carte.

Répondre

2

Pourquoi ne pas simplement ajouter vos conditions à un sql-query:

$regions = Region::with('neighbors') 
    ->join('cards', 'cards.id', '=', 'regions.risk_card_id') 
    ->whereNotNull('user_id') 
    ->inRandomOrder() 
    ->limit($regionsPerUser) 
    ->get(); 

Si vous avez déjà une collection, vous pouvez faire quelque chose comme:

$regions = $regions 
    ->filter(function ($value) { 
     return !is_null($value['user_id']); 
    }) 
    ->random($regionsPerUser); 
+0

ah non, parce que cette collection a été post manipulé l'obtenir de DB. Je cherche à accéder à la collection en mémoire. – TheRealPapa

+0

Ajout d'une mise à jour, vérifiez. –