Bonjour à tous,
Encore une fois je sollicite votre aide sur cakephp 2.
J'aimerai comprendre comment construire mon tableau pour que mes requêtes complexes puissent intégrer des AND et des OR.

Voici l'idée :
J'ai une page qui map les champs de ma table dynamiquement.
je peux ajouter mes champ dans une file, et sur chaque champ y appliquer des conditions afin de construire un json de conditions.
Je peux également grouper des conditions si nécessaire

Voici un exemple :

{"data1":{"id":1,"model":"user","table":"username","type":"text","camel":"","operator":"","rule":"empty","conditions":"fabienc"},"data2":{"id":2,"model":"user","table":"username","type":"text","camel":"","operator":"and","rule":"empty","conditions":"fabienc1"},"data3":{"id":3,"model":"user","table":"username","type":"text","camel":"","operator":"or","rule":"empty","conditions":"fabienc2"}}

Ce qui me permet par la suite de créer ma conditions afin d'obtenir un tableau

array(
    (int) 0 => array(
        'User.username' => 'fabienc'
    ),
    (int) 1 => array(
        'User.username' => 'fabienc1'
    ),
    'OR' => array(
        (int) 0 => array(
            'User.username' => 'fabienc2'
        )
    )
)

Mais qui me créé une requête comme suit :

'SELECT `User`.`id`, `User`.`username`, `User`.`first_name`, `User`.`last_name`, `User`.`email` FROM `Base_donnees`.`users` AS `User`   WHERE `User`.`username` = 'fabienc' AND `User`.`username` = 'fabienc1' **AND** `User`.`username` = 'fabienc2''

Au lieu d'avoir un truc du style

'SELECT `User`.`id`, `User`.`username`, `User`.`first_name`, `User`.`last_name`, `User`.`email` FROM `Base_donnees`.`users` AS `User`   WHERE `User`.`username` = 'fabienc' AND `User`.`username` = 'fabienc1' **OR** `User`.`username` = 'fabienc2''

Et la chose se complexifie un peu plus lorsque je mets des groupes de conditions.

Je ne vois pas quelle est la structure de tableau je dois créer pour obtenir une requête sql exacte.
Pourriez-vous m'aider à comprendre la logique ?

Merci pour votre aide.

Fabien

4 réponses


Bonjour.
Je ne vois pas l'intérêt d'utiliser la clé OR pour mettre la même condition que précédemment.
Montres plutôt la requête SQL que tu fais, par exemple :

$this->User->find('all', [
    'fields' => ['id', 'username', 'first_name', 'last_name', 'email'], 
    'conditions' => [
        'username' => 'fabienc', 'username' => 'fabienc1', 
            'OR' => ['username' => 'fabienc2']
    ]
];

La requête ci-dessus, correspond à la dernière requête que tu as mentionné.

fabienc
Auteur

Salut,

Merci pour ton retour. Si je construis le tableau en suivant ce que tu m'indiques, et bien la requête OR ne se déclenche pas. Je reste sur des AND.

J'ai beaucoup réfléchi et je commence à piger le truc.

Voici un autre exemple de requête SQL de test :

'SELECT `User`.`id`, `User`.`username`, `User`.`first_name`, `User`.`last_name`, `User`.`email` FROM `table`.`users` AS `User`   WHERE ((((`User`.`first_name` = 'fabienc')  AND  (`User`.`username` = 'fabienc'))) OR (`User`.`created` = '2015-08-26') OR (`User`.`active` = '1'))'

que je génère après avoir construit dynamiquement ce tableau

$conditions = array(
    'OR' => array(
        (int) 0 => array(
            (int) 0 => array(
                'User.first_name' => 'fabienc'
            ),
            (int) 1 => array(
                'User.username' => 'fabienc'
            )
        ),
        (int) 1 => array(
            'User.created' => '2015-08-26'
        ),
        (int) 2 => array(
            'User.active' => '1'
        )
    )
)

du coup je peux ajouter autant de conditions AND et OR.
Maintenant reste plus qu'à comprendre comment je construis mon tableau pour créer des groupes de AND et de OR

Je pense que j'y suis presque, mais pour toi mes requêtes sont mal formées?

Fabien

La requête que je t'ai démontré, est exactement ce que tu voulais avoir dans la dernière requête que tu désignais dans ton post précédent, et dans la requête générée, il y a forcément les ANDet le OR, le retour après, dépend de ce qui est trouvé en base de données.
Par contre, j'ai l'impression que tu as du mal à construire la requête comme tu la voudrais.

fabienc
Auteur

En cela correspondait à ma précédente requête.
Au final je suis parvenu à construire mes requêtes simples avec juste des AND et des OR (autant que nécessaire, même si mes exemples sont idiots)
Mon prochain défi ce sont les groupes
Je te ferai un retour dès que j'aurai réussi à le faire.
Merci pour tes précieux conseils.

Fabien