savoir si une entree existe dans la base de donnees ou pas!

18 views
Skip to first unread message

marocinfo

unread,
Feb 12, 2009, 4:52:42 PM2/12/09
to Cakephp-fr
Bonjour,

j'ai deux tables

Table : machines
id name description
_________________________________
1 A machine A
2 B machine B
3 C machine C
etc....


Table : appels

id date
machine_name valeur
_________________________________________________________
1 2009-02-11 13:02:23
C 13
2 2009-02-11 14:42:23
B 24
etc

Je voulais lister les machines qui n'ont pas appelé hier :

Dans View je voulais montrer ces paramètres :

Machines qu n ont pas pu appeler hier sont :

Machine Name


Merci




Rabie Khabouze

unread,
Feb 12, 2009, 5:05:28 PM2/12/09
to Cakephp-fr


Table : appels

id               date                            machine_name               valeur
_________________________________________________________
1               2009-02-11 13:02:23     C                                    13
2               2009-02-11 14:42:23     B                                    24
etc



 pardon la table n etais bien formate

Pierre MARTIN

unread,
Feb 13, 2009, 5:58:52 AM2/13/09
to Cakephp-fr
Bonjour,

Essaye de faire :
$date_minimum = à toi de mettre ce que tu veux ici;
$condition = array(
'conditions' => array('Appel.date <' => $date_minimum),
'fields' => array('Appel.machine_name'),
);
$this->Appel->find('all', $condition);

Je n'ai pas testé le code, mais te conseille d'aller voir la
documentation pour t'aider : http://book.cakephp.org/view/73/Retrieving-Your-Data
de plus, saches que tu auras sans dout plus de succès en posant ta
question sur le forum : http://forum.cakephp-fr.org/

Bonne journée,
Pierre

Rabie Khabouze

unread,
Feb 13, 2009, 7:30:18 AM2/13/09
to cakep...@googlegroups.com
Merci Pierre de ta reponse,
 
ton code ne vas pas fonctionner car tu ne sais pas la liste des machines, je doit comparer la liste des machines que j ai dans la table machines avec la liste des machines qui ont appler dans telle date et montrer que celles qui n'ont pas appeler.
 
$machines = $this->Machine->find('all');
 
foreach($machines as $machine) {
 
$date_minimum = à toi de mettre ce que tu veux ici;
$condition = array(
           'conditions' => array('Appel.date <' => $date_minimum, 'Appel.machine_name !=' => $machine['Machine']['name']),

           'fields' => array('Appel.machine_name'),
);
$result = $this->Appel->find('all', $condition);
 
//donc la logic apres sera passer au View
if  ($result)
{
echo $machine['Machine']['name'];
}
 
}
 
Le code n'est pas assez complet mais j ai montrer juste la logique derriere mon probleme
 
Merci.
 
 
 


 
2009/2/13 Pierre MARTIN <rea...@gmail.com>

Pierre MARTIN

unread,
Feb 13, 2009, 7:51:01 AM2/13/09
to Cakephp-fr
Bonjour,

Une fois que tu as récupéré les machines tu fais ce que tu veux
ensuite.
Cependant, dans ton cas il semble qu'il y ait un lien entre les deux
tables ... créer une association te facilitera la vie ! Au lieu de
"machine_name", mets "machine_id" et relie les modèles entre eux.
> http://book.cakephp.org/fr/view/78/Associations-relier-les-mod%C3%A8les-entre-eux

Normalement tu auras tout en ta possession pour manipuler tes
informations ensuite.
Pierre

Rabie Khabouze

unread,
Feb 13, 2009, 12:35:22 PM2/13/09
to cakep...@googlegroups.com
J'ai mis cron job qui insère les données de la machine lorsqu elle appelle en utilisant le nom de la machine pas le ID.
j utilise l association avec machine_name étant que foreign key, mais ce que je veux maintenant c est lister les machines qui n' ont pas appelé

Table des machines a toute les machines que j'ai, et Table Appel  a les machines qui ont appelé, biensur que je peux lister les machines qui ont appelé dans telle date mais pas le contraire.

Pierre MARTIN

unread,
Feb 14, 2009, 7:11:33 AM2/14/09
to Cakephp-fr
Bonjour,

Quoi qu'il en soit, si tu n'as pas d'association classique dans tes
modèles tu n'auras pas d'autres choix que de faire un "genre" de
array_diff entre les résultats ...
Autrement je te conseille d'essayer en lisant la doc :
http://book.cakephp.org/fr/view/73/R%C3%A9cup%C3%A9rer-vos-donn%C3%A9es

Bonne journée et désolé de ne pouvoir faire mieux !

On 13 fév, 18:35, Rabie Khabouze <rabi...@gmail.com> wrote:
> J'ai mis cron job qui insère les données de la machine lorsqu elle appelle
> en utilisant le nom de la machine pas le ID.
> j utilise l association avec machine_name étant que foreign key, mais ce que
> je veux maintenant c est lister les machines qui n' ont pas appelé
>
> Table des machines a toute les machines que j'ai, et Table Appel  a les
> machines qui ont appelé, biensur que je peux lister les machines qui ont
> appelé dans telle date mais pas le contraire.
>
> 2009/2/13 Pierre MARTIN <rea...@gmail.com>
>
>
>
> > Bonjour,
>
> > Une fois que tu as récupéré les machines tu fais ce que tu veux
> > ensuite.
> > Cependant, dans ton cas il semble qu'il y ait un lien entre les deux
> > tables ... créer une association te facilitera la vie ! Au lieu de
> > "machine_name", mets "machine_id" et relie les modèles entre eux.
>
> >http://book.cakephp.org/fr/view/78/Associations-relier-les-mod%C3%A8l...

Mehdi AMINI

unread,
Feb 15, 2009, 8:28:20 AM2/15/09
to cakep...@googlegroups.com

> j utilise l association avec machine_name étant que foreign key, mais
> ce que je veux maintenant c est lister les machines qui n' ont pas appelé

Ca fonctionne si machine_name est primary dans "machines".

Si j'ai bien compris, ton problème est que la liaison est "Machine
hasMany Appel" . Or ceci génère 2 requêtes et donc ne permet pas de
filtrer. CounterCache ne t'aidera pas puisque tu veux pouvoir spécifier
des dates pour les appels.
La seule solution que je vois est une requête perso du genre :

$this->Machine->query("Select * from machines where name not in (select
machine_name from appels where date < .... and date > .... )");

Tu peux aussi le faire en 2 fois sans ecrire de requête SQL, genre :

$appels=Set::combine($this->Appel->find('all',array('conditions'=>array('Appel.date'=>
.... ))),
'{n}.Appel.id',
array('%s','{n}.Appel.machine_name'))
$machines =
$this->Machine->find('all',array('conditions'=>array('NOT'=>array('Machine.name'=>$appels))));


Mehdi

Rabie Khabouze

unread,
Feb 15, 2009, 11:35:27 AM2/15/09
to cakep...@googlegroups.com
Bonjour,

Amine la deuxieme methode que t'as mentionné a bien marché en fin j ai
mis fait la requette suivante qui fonctionne aussi.

SELECT * FROM machines, appels where machines.name =
appels.machine_name and appells.date > '2009-02-15 00:00:00' AND
count(appels.machine_name) = 0 GROUP BY appels.machine_name


Merci


2009/2/15 Mehdi AMINI <joke...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages