php - Comment fusionner plusieurs requêtes conditionnelles floues dans Laravel?
ringa_lee
ringa_lee 2017-05-16 12:02:58
0
5
1735

Supposons maintenant que je reçoive le tableau de formulaires depuis le front-end :
$input = $request->input();
contient 4 valeurs : email, nom, âge, sexe. Désormais, la table de données doit être interrogée en fonction des valeurs saisies par l'utilisateur si l'utilisateur saisit l'e-mail et le nom. , la requête sera floue, si l'âge et le sexe sont saisis, une requête précise sera effectuée
Mais voici le problème. L'utilisateur peut remplir l'une de ces quatre entrées. , ou peut-être 4. Ensuite, lorsque j'utilise le constructeur de requête, il est impossible de juger si chaque valeur existe, puis d'écrire le constructeur. Après tout, la requête floue et la requête exacte sont écrites différemment, et par exemple, j'ai maintenant deux champs. (e-mail et nom) nécessitent une requête floue. Le constructeur de Laravel pour une requête floue s'écrit comme ceci :
->where('email', 'LIKE', $input['email'])
Ensuite, je dois déterminer si l'e-mail et le nom existent dans le programme, puis fusionner le constructeur de requête ?
L'idée est :

1.email存在,姓名不存在
->where('email', 'LIKE', $input['email'])
2.email不存在,姓名存在
->where('name', 'LIKE', $input['name'])
3.都存在
->where('email', 'LIKE', $input['email'])->->where('name', 'LIKE', $input['name'])

La quantité de code est trop importante. Si j'ai dix champs pour une requête floue, je ne peux pas du tout utiliser le constructeur.
Pouvez-vous me dire s'il existe un autre moyen, par exemple :

if($input['email']) $where['email'] = $input['email']
if($input['name'])  $where['name']  = $input['name']

Utilisez ensuite :
->where( 'LIKE', $where), pour que j'inclue toutes les situations qui peuvent ou non exister sur une seule ligne
D'autres méthodes d'écriture sont recommandées sur Internet :
$where['email'] = ['j'aime', $input['email']], mais mon laravel5.1 ne peut pas être utilisé.
Avez-vous de bonnes méthodes pour résoudre les requêtes floues multi-conditions et les requêtes non floues ?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(5)
洪涛

Laravel peut transmettre des fonctions anonymes où.

Vous pouvez juger dans cette fonction anonyme.

Par exemple, comme ça

where(function ($query) use ($request) {
    $request->input('email') && $query->where('email', $request->input('email'));
    $request->input('name') && $query->where('name', $request->input('name'));
})

De cette façon, vous pouvez porter des jugements appropriés sans détruire la structure du constructeur.

某草草

Je n'ai jamais utilisé 5.1, mais 5.4 a une méthode when, exemple :

$query->when($name, function($query) use ($name){
    $query->where('name', 'like', '%' . $name . '%');
});

Cela signifie que lorsque $name n'est pas vide, la fonction suivante

sera exécutée.

Veuillez vérifier s'il existe une méthode similaire dans 5.1

滿天的星座

En parlant du générateur de requêteswhere()方法是返回$this - vous pouvez donc les écrire successivement, mais cela ne dit pas que vous devez les écrire successivement !

Quand il y a beaucoup de champs, est-il acceptable d'écrire une boucle for ? :


$query = XXXModel::query();

for ($field in ['name', 'email', "... 你相加什么字段加什么字段"]){
    if ($fieldValue = $request->input($field)){
        $query->where($field, 'LIKE', "%$fieldValue%");
    }
}

// 继续添加where条件,或者查询数据...
小葫芦
$query = DB::table($table_name);
foreach ($conditions as $condition) {
    $query->where($condition, 'LIKE' $input($ocndition);
}
$query->get();
大家讲道理

Vous devez porter un jugement, que vous rendiez le jugement ou que le cadre fasse le jugement. S'il y a 10 champs pour une requête floue, votre MySQL peut-il les gérer ? Utilisez simplement un moteur de recherche à la place ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal