2017-09-18 1 views
0

J'ai un problème d'analyse lorsque je veux obtenir toutes les personnes avec un abonnement particulier, mais pas les personnes qui ont un autre type d'abonnement. Les abonnements sont stockés dans une liste délimitée par des virgules dans la table des abonnements de la colonne des abonnements. Voici le code que j'ai jusqu'à présent:Multiple Eloquent Où les instructions avec plusieurs paramètres

 $includeQuery = []; 
     foreach ($includeSegment as $include) { 
      $singleQuery = ['subscriptions','like', '%'.$include.'%', 'or']; 
      array_push($includeQuery, $singleQuery); 
     } 
     $excludeQuery = []; 
     foreach ($excludeSegment as $exclude) { 
      $singleQuery = ['subscriptions', 'not like', '%'.$exclude.'%', 'or']; 
      array_push($excludeQuery, $singleQuery); 
     } 

     $included = Subscription::where($excludeQuery)->where($includeQuery)->get(); 

j'obtenir des résultats en arrière, mais certains d'entre eux ont les abonnements exclus en eux.

+0

Utiliser les fonctions de requête à l'intérieur où les clauses aident? –

Répondre

0

Le problème avec le code ci-dessus était dans le paramètre booléen j'avais « ou » au lieu de « et ». Donc, seulement si tous les abonnements pour un utilisateur particulier étaient présents, l'enregistrement serait rejeté. Voici le code mis à jour:

 $includeQuery = []; 
     foreach ($includeSegment as $include) { 
      $singleQuery = ['subscriptions','like', '%'.$include.'%', 'or']; 
      array_push($includeQuery, $singleQuery); 
     } 
     $excludeQuery = []; 
     foreach ($excludeSegment as $exclude) { 
      $singleQuery = ['subscriptions', 'not like', '%'.$exclude.'%', 'and']; 
      array_push($excludeQuery, $singleQuery); 
     } 

//  $included = Subscription::where($excludeQuery)->where($includeQuery)->get(); 
     $included = DB::table('subscriptions') 
      ->join('app_users', 'app_users.customer_number', '=', 'subscriptions.customer_number') 
      ->join('app_datas', 'app_datas.customer_number', '=', 'subscriptions.customer_number') 
      ->where($includeQuery) 
      ->where($excludeQuery) 
      ->select('app_datas.device_token') 
      ->get(); 
+1

Alors, c'est résolu? Agréable! – Arty

0

utilisation et whereNotIn à la place dans laquelle:

Abonnement :: où (includeSegment $) -> whereNotIn (excludeSegment $) -> get();

alors vous ne devez aussi itérer segments une fois qu'ils sont des tableaux de chaînes

+1

ok, je viens de réaliser que votre colonne a des valeurs séparées par des virgules, donc cela ne fonctionnera évidemment pas – Markownikow

+0

alors peut-être que vous devriez essayer avec whereRaw() et la fonction mysql LOCATE, https://dev.mysql.com/doc/refman/5.7/en /string-functions.html#function_locate – Markownikow