2
votes

Utilisation de la méthode unique () lors de la génération d'une liste d'options dans le modèle de lame

J'ai besoin de générer une liste d'options dans mon formulaire à partir d'une colonne appelée product_name dans ma base de données. Je le fais dans le modèle de lame comme ceci:

public function index()
{
    $products = Product::all();
    return view('products.index', compact('products'));
}

Et le contrôleur est le suivant:

<select name="product" >
    <option value="" disabled>Click to select</option>
    @foreach ($products as $product)
	<option value="{{$product->product_name}}">{{$product->product_name}}</option>
	@endforeach
</select>

Cela a bien fonctionné jusqu'à présent, mais j'ai de plus en plus de lignes de product_name dans ma base de données au fur et à mesure que ma gamme de produits grandit, car chaque ligne est unique pour sa description et non son nom. Ainsi, il y a quelques options en double dans mon formulaire.

Je comprends que Laravel a une méthode unique () pour les collections. Dans ce cas, à chaque itération de @foreach , j'obtiens une chaîne en option et donc unique () ne peut pas être utilisé.

Quels sont les autres moyens disponibles dans Laravel pour filtrer les données dupliquées?


3 commentaires

Veuillez mettre à jour votre question avec le code du contrôleur afin que nous puissions mieux examiner le problème.


Salut! J'ai mis à jour ma question avec le code du contrôleur correspondant


Vous pouvez utiliser distinct () . ie $ products = Product :: query () -> distinct () -> get (); ou $ products = Product :: query () -> distinct ('product_name') - > get ();


3 Réponses :


0
votes

Vous pouvez regrouper votre requête pour le nom du produit et la colonne de description du produit et récupérer le résultat comme ceci:

public function index()
{
    $products = Product::select('product_name', 'product_description')
        ->orderBy('product_name') 
        ->groupBy('product_name', 'product_description')
        ->get();

    return view('products.index', compact('products'));
}

Mise à jour de la requête avec Trier par.


5 commentaires

Merci pour les commentaires. J'ai juste essayé ça. J'ai réussi à supprimer les doublons des noms de produits. Si je devais le trier, j'ajoute simplement -> sort () est-ce correct?


Vous pouvez ajouter ceci pour classer le résultat- -> orderBy ('column', 'desc')


J'ai mis à jour la réponse, veuillez jeter un coup d'œil et faites-moi savoir si cela ne fonctionne pas.


Il fonctionne très bien! Merci beaucoup! Je suppose que unique () n'est pas la bonne façon de traiter la plupart de ces requêtes.


Veuillez le marquer comme une réponse si cela a fonctionné pour vous. Vous pouvez utiliser distinct lorsqu'une seule colonne est requise comme champ unique.



0
votes

Essayez d'utiliser pluck;

public function index()
{
    //Use pluck for selecting only specific column. You can take multiple columns as 
    well.
    $product_names = Product::pluck('product_name');
    $products = array_unique($product_names);
    return view('products.index', compact('products'));
}


0 commentaires

0
votes
public function index()
{
    $products = Product::pluck('product_name', 'product_name')
                       ->toArray();

    return view('products.index', compact('products'));
}
That will return a unique product names

0 commentaires