0

Cela m'a étonné. Je suis en train de filtrer $ages=Ages::all(); basée sur un champ de productmask utilisant l'opérateur bitwise & (code doit être explicite)laravel 5.4 opérations bitwise ne fonctionne pas comme prévu (éloquent)

J'ai essayé

@foreach($ages->where('productmask', '&', 2) as $option)  

et

@foreach($ages->filter(function($i){return ((int)($i->productmask & 2)); }) as $option) 

et

@foreach($ages->filter(function($i){return ((int)($i->productmask & 2) == 2); })->values() as $option) 

et aucun wo rk quand productmask = 3 mais fonctionne quand le masque de produit est exactement 2.

Quelles sont mes options ici (sans jeu de mots)? Pourquoi ça ne marche pas?

Je suis assez sûr que cela fonctionnerait si je faisais un \DB::whereRaw (parce que je peux faire exécuter sur le Db et il fonctionne et je reçois les 2 et 3 entrées):

SELECT * from ages WHERE productmask&2

mais ici c'est contourner couramment et frapper la base de données à l'intérieur d'une vue ?? Pas bonne forme.

Est-ce que quelqu'un qui utilise des masques de bits là-bas est déjà dans ce cas?

merci d'avance.

Répondre

0

De l'source ici suggère que

où() prend 3 paramètres, le nom de la colonne, l'opérateur et la valeur à être comparés.

L'opérateur peut être l'un des éléments suivants: '! =' '=', '<', '>', '< =', '> =', '<>',, 'comme', 'pas comme', 'entre', 'ilike'

Cependant, j'ai trouvé quelque chose que vous pourriez avoir besoin de regarder here. Cela vous aidera à résoudre vos problèmes.

Pour plus creuser see PHP documentation lire aussi ce SO post

et pour autant que votre question concerne

utiliser votre requête comme ceci

$ages->whereRaw('(productmask & 2)') 
+0

Oui, j'ai regardé cela mais je préfère ne pas avoir à ajouter un nouveau paquet et implémenter de nouveaux types de champs juste pour atténuer ce qui semble être un simple problème mathématique avec Eloquent. Ou du moins avec eux, j'essaie de l'utiliser. De vendeur/Laravel/Cadre/src/Illuminate/Base de données/Requête/Builder.php protégées $ opérateurs = [ '=', '', '<', '><=', '> =', '<>', '! =' , 'like', 'like binary', 'like', 'between', 'ilike', '&', '|', '^', '<<', '>>', 'rlike', 'regexp' , 'not regexp', '~', '~ *', '! ~', '! ~ *', 'semblable à', 'non similaire à', ]; – harrisoftware

+0

s'il vous plaît vérifier la réponse mise à jour –

+0

j'ai essayé whereRaw. Cette méthode semble uniquement disponible sur la classe ('Ages: whereRaw()'). J'ai trouvé une méthode introuvable quand j'ai essayé de l'utiliser sur les résultats de '$ ages = Ages :: all();'. '$ ages-> whereRaw()' a échoué. – harrisoftware

1

Eh bien, je ne sais pas pourquoi je devais pour faire cela exactement, mais voici ce que j'ai fait pour le faire fonctionner:

@foreach($locations->filter(function($i){if (decbin($i->productmask) & 16) return $i; }) as $option)  

Fondamentalement, j'ai dû utiliser decbin() sur la valeur du champ de la collection ($ages->productmask) afin que la comparaison se résoudrait correctement.

Fonctionne maintenant! J'espère que cela aide quelqu'un.

+0

heureux de résoudre ce problème :) –

+0

une fois que vous avez eu le droit d'accepter la réponse, vous acceptez la réponse à votre question –