Besoin d'aide ?

between et where

Avatar de KYoann
KYoann

Salut à tous,

J'essai de faire une requette combinant des between sur mes valeurs de date début et fin afin de controler si certaines période sont déjà enregistré en base, ce qui fonctionne très bien en faisant ca :

$valeurs = Modele::whereBetween('debut',[$debut,$fin])
                            ->orWhereBetween('fin',[$debut,$fin])
                            ->get();

Par contre quand j'essai de rajouter une contrainte, par exemple avec un id présent dans la table, j'ai toujours exactement le même résultat, la contrainte n'est pas utilisé, exemple :

$valeurs = modele::whereBetween('debut',[$debut,$fin])
                            ->orWhereBetween('fin',[$debut,$fin])
                            ->where('user_id','=',$request->user_id)
                            ->get();

J'ai bien sur vérifier mes nom de variables, leurs valeurs, les nom des champs etc, c'est vraiment cette contrainte qui n'est pas exploité par l'orm.

Du coup je suis obliger de faire un truc bien dégeu en bouclant sur mes résultats afin de faire mes traitement de filtrage.....

Merci

Posté il y a 3 mois
Avatar de bestmomo
bestmomo

Salut,

Tu veux peut-être ça :

$valeurs = modele::where('user_id', $request->user_id)->where(function ($q) use($debut, $fin) {
        $q->whereBetween('debut', [$debut, $fin])->orWhereBetween('fin', [$debut, $fin]);
})->get();
Posté il y a 3 mois
Avatar de KYoann
KYoann

C'est parfait !!

Je pensais que ce genre de format de "requete" était uniquement fait pour les sous requetes, du coup combien en sont executé sous cette forme ? qu'une seule ?

Posté il y a 3 mois
Avatar de bestmomo
bestmomo

Salut,

C'est facile d'avoir la réponse avec toSql par exemple. Là on ne génère qu'une requête, c'est juste une histoire d'organisation de where.

Posté il y a 3 mois
Avatar de KYoann
KYoann

Merci pour l'astuce du toSql, je ne la connaissait pas !

Posté il y a 3 mois
Avatar de KYoann
KYoann

Salut à tous.

Je me permet de revenir, car cette solution fonctionne, mais pas à 100%

Dans le cas ou l'heure de début et l'heure de fin sont toute les deux comprise entre les données en base, comme il s'agit d'un orBetween, ce cas de figure n'est pas pris en compte.

J'ai donc essayé de rajouter un deuxieme controle, mais cela ne fonctionne pas mieux.

$valeurs = modele::where('user_id', $request->user_id)->where(function ($q) use($debut, $fin) {

        $q->whereBetween('debut', [$debut, $fin])->orWhereBetween('fin', [$debut, $fin]);

})orWhere('user_id', $request->user_id)->where(function ($q) use($debut, $fin) {

        $q->whereBetween('debut', [$debut, $fin])->WhereBetween('fin', [$debut, $fin]);

}) ;

Merci pour votre aide.

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

J'avoue que je ne comprends pas le problème...

Posté il y a 2 mois
Avatar de KYoann
KYoann

A mince,

La requette exectuté par eloquent est la suivante :

"select * from `rendezvous` where `rendezvous`.`userr_id` = ? and (`debut` between ? and ? or `fin` between ? and ?) or (`debut` between ? and ? and `fin` between ? and ?)"

Je comprend pas non plus pourquoi cette requette ne marche pas :/

Posté il y a 2 mois

Vous ne pouvez pas répondre à ce sujet.