0
votes

Laravel Eloquent - Plusieurs requêtes PAS COMME?

J'ai une sortie modifiable de la base de données comme celle-ci:

1,2,3,4 et parfois 5,4,9

Je souhaite ajouter une clause not like where en fonction de l'utilisateur:

Par exemple:

Utilisateur 1

$products = \App\Product::where('user', '2')
    ->where(['category', 'not like', '5,4,9')
    ->get();

Utilisateur 2

$products = \App\Product::where('user', '1')
    ->where(['category', 'not like', '1,2,3,4')
    ->get();


1 commentaires

Je réponds à votre question, mais j'ai le sentiment que nous ne comprenons peut-être pas votre point de vue, si nos réponses ne correspondent pas à ce que vous recherchez, faites-le nous savoir et modifiez un peu la question.


5 Réponses :


2
votes

https://laravel.com/docs/5.8/queries#where-clauses

$products = \App\Product::where('user','2')
  ->whereNotIn('category', [5, 4, 9])
  ->get();


3 commentaires

quand j'utilise `$ result =" 5,4,9 "; -> whereNotIn ('category', [$ result]) `ne fonctionne pas


comment la catégorie de produit stockée dans votre base de données? en tant que chaîne?


$ result doit être un tableau comme ceci $ result = [5,4,9], pas une chaîne, puis vous l'utilisez comme ceci ('category', $ result)



0
votes

Si tout ce dont vous avez besoin est de changer la catégorie, pourquoi ne pas en faire une variable comme celle-ci.

$categories = $userId == 1 ? [1,2,3,4] : [5,4,9];

$products = \App\Product::where('user',$userId)
  ->whereNotIn('category', $categories)
  ->get();

Je suppose donc que vous devez avoir une méthode pour voir quelles catégories un utilisateur devrait avoir ce serait plus complexe que cela, mais bon j'espère que vous avez l'idée.


0 commentaires

-1
votes

Si votre sortie modifiable est un tableau, vous pouvez essayer ceci:

$categories = [1, 2, 3, 4];

$products = \App\Product::where('user', 1)
   ->whereNotIn('category', $categories)
   ->get();


0 commentaires

0
votes

Une autre façon

 $user_id = $request->input('id');//Put your user id in variable either by request or anyway you want to save
 $category_arr = [];

 if($user_id == 1) {
   $category_arr = [1,2,3,4];   
 } elseif ($user_id == 2) {
   $category_arr = [5,4,9];
 } else {
   echo "Error Msg"
 }

$products = \App\Product::where('user',user_id)
   ->whereNotIn('category', $category_arr)
   ->get();


0 commentaires

0
votes

Ceci est une réponse qui étend les Bobrik Romains et Eli.

Le but est de permettre à votre requête de pouvoir gérer une condition par défaut tout en traitant une requête spécifique lorsque vous en avez besoin.

if ($request->input('id') == 1) {$categories = [1,2,3,4];}
if ($request->input('id') == 2) {$categories = [5,4,9];}

$products = \App\Product::where('user', $request->input('id'))
    ->when(isset($categories), function($query) use($categories) { // This will be applied for specified users. In this case, users id = 1 || 2
        return $query->whereNotIn('category', $categories);
    })->when(!isset($categories), function($query) { // This will be applied when users id != 1 || 2
        return $query->whereNotIn('category', [1,2]); //Define your default categories for every users that are not specified at the begining.
    })->get();

Vous pouvez également enregistrer le tableau des catégories dans la table des utilisateurs et modifier la condition when () pour when (Auth :: user () -> categories! = null) et when (Auth :: user () -> categories == null) .

Le seul avertissement est que lorsque vous utilisez ce type de requête, vous devez avoir deux conditions when () c'est exactement le contraire. Parce que si aucune des deux conditions n'est respectée, la requête finale sera $ products = \ App \ Product :: where ('user', $ request-> input ('id')) -> get (); et je suis sûr que cela n'arrivera pas.

Eh bien, vous pouvez enchaîner plus de deux conditions when (), mais assurez-vous d'en avoir une qui capturera tout ce qui était pas attrapé par aucun autre.


0 commentaires