Avancé whereNotNull déclaration dans Laravel
Est-il possible d'effectuer les opérations suivantes dans Laravel 4? ...
DB::table('myTable')
->select(DB::raw($columnNames))
->whereNotNull(function($query) use($columns) {
foreach ($columns as $column) {
$query->whereNotNull($column);
}
})
->get();
Si j'ai le tableau suivant:
table: myTable
id | name | age | weight
======================================
1 Jane NULL 150
2 NULL 12 80
3 Bob NULL NULL
4 John 22 120
5 Cody NULL NULL
Si $columns
est [age, weight]
et $columnNames
est 'age, weight'
, puis d'appliquer l'-dessus whereNotNull déclaration, je m'attendrais à la sortie comme ceci:
age | weight
===================
NULL 150
12 80
22 120
Comment puis-je obtenir ce fait?
Mise à JOUR:
La condition est de retourner toutes les lignes où les colonnes sélectionnées ne sont pas TOUS nuls. Ainsi, un whereNotNull
clause doit être appliquée à chaque (sélectionné) de la colonne, dans chaque ligne. Si toutes les colonnes sont NULLES, alors whereNotNull retournera false et que la ligne ne devrait pas faire partie des résultats. Donc, seules les lignes qui ont AU MOINS une valeur non NULL doit être retourné.
- Si la condition est: au moins l'un des
$columns
ne peut pas êtreNULL
? - J'ai clarifié la condition dans ma question, merci!
Vous devez vous connecter pour publier un commentaire.
Si ceux sont les seuls où vous n'avez même pas besoin d'un imbriquées où. Important:
orWhereNotNull
au lieu dewhereNotNull
de sorte qu'une seule colonne a pasNULL
.Aussi (au moins avec votre exemple), vous n'avez pas besoin d'une variable distincte
$columnNames
depuisselect
accepte un tableau de noms de colonne.Si vous avez besoin de plus où les conditions (en particulier ceux avec
AND
) vous avez besoin d'un imbriquées où:Imbriquée où va mettre
(
)
autour les clauses where. Cela signifie que, au lieu de:Vous bénéficiez de:
Essayez d'utiliser d'où() la méthode d'emballage. Cela permettrait d'afficher uniquement les enregistrements qui ont à la fois un âge ET un poids.
Pour afficher tous les enregistrements qui ont un âge OU un poids, utiliser orWhereNotNull() dans la boucle.
Je ne vois pas pourquoi une boucle ne fonctionne pas, parce que vous êtes effectivement en faisant ceci:
$query = $query->whereNotNull('age');
$query = $query->whereNotNull('weight');
$results = $query->get();