SELECT sur 2 tables

Par sirheisenberg, il y a 9 ans


Bonjour tout le monde,

J'ai deux tables Ventes et Clients.

Ce que je fait :

$this->set('mesventes', $this->Ventes->find('all', array( 'fields' => array('prix','telephone_vendeur','numero_dossier'), 'group' => array('telephone_vendeur','numero_dossier') ) ));

Les champs telephone_vendeur et prix et numero_dossier sont dans la table Ventes.

Ce que je veux :

Je veux afficher le nom du vendeur et l'adresse du vendeur qui sont dans la table Clients.
Je sais le faire en SQL mais pas avec CakePHP.

Merci de votre aide !

14 réponses

Kareylo, il y a 9 ans

Quelle version de CakePHP, s'il te plait ?

sirheisenberg, il y a 9 ans

La version 2

Kareylo, il y a 9 ans

Si tu utilises le component "Containable" :

$this->Ventes->find('all', array( 'fields' => array('prix','telephone_vendeur','numero_dossier', 'Clients.adresse', 'Clients.nom'), 'group' => array('telephone_vendeur','numero_dossier'), 'contain' => array('Clients') // Nom du model ) )

Si tu ne l'utilises pas :

$this->Ventes->recursive = 1; $this->Ventes->find('all', array( 'fields' => array('prix','telephone_vendeur','numero_dossier', 'Clients.adresse', 'Clients.nom'), 'group' => array('telephone_vendeur','numero_dossier') ) )
sirheisenberg, il y a 9 ans

Merci de ton aide Kareylo, malheureusement les 2 solutions ne fonctionnent pas. Dans les 2 cas j'ai cette erreur :

Error: SQLSTATE[42000]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]The multi-part identifier "Clients.adresse" could not be bound.

Et quand j'enlève Clients.adresse j'ai la même erreur pour Clients.nom

Kareylo, il y a 9 ans

Essaie sans le s à Clients

sirheisenberg, il y a 9 ans

J'ai essayé et j'ai toujours la même erreur

Kareylo, il y a 9 ans

Tu as bien mis le nom de tes champs au lieu de ceux que j'ai mis ? (Car je peux pas les deviner)

sirheisenberg, il y a 9 ans

"Tu as bien mis le nom de tes champs au lieu de ceux que j'ai mis ? (Car je peux pas les deviner)"

Oui ils s'appellent simplement adresse et nom

"Et après, ça peut te parraître bête, mais as-tu jeté un oeil sur la documentation officielle pour comprendre le comportement du find ?"

Oui mais je n'ai pas trouvé comment faire ce que je veux faire

sirheisenberg, il y a 9 ans

En effet, ce n'est pas moi qui ai réalisé l'implémentation de la BDD et il n'y aucune association entre les modèles.
Si j'ai bien compris, dans le modèle Clients je dois mettre :

public $hasMany = 'Ventes';

Et dans le modèle Ventes :

public $hasAndBelongsToMany = array( 'Clients' => array( 'className' => 'Clients', 'foreignKey' => 'telephone_vendeur'));
Kareylo, il y a 9 ans

Je ne sais pas à quoi ressemble ta base de données, mais avec un $hasMany d'un côté, on a un $belongsTo de l'autre.

sirheisenberg, il y a 9 ans

Tu as raison. Donc après ça il suffisait juste d'écrire la requête comme ça :

$this->set('mesventes', $this->Ventes->find('all', array( 'fields' => array('prix', 'Ventes.telephone_vendeur', 'Ventes.numero_dossier', 'Clients.nom', 'Clients.adresse'), 'group' => array('Ventes.telephone_vendeur','Ventes.numero_dossier', 'Clients.nom', 'Clients.adresse') ) ));

Merci à toi Kareylo

Kareylo, il y a 9 ans

Un plaisir ! Hésite pas à passer le sujet en résolu.