Bonsoir,
J'ai récemment utilisé Doctrine vite fait puis regardé comment fonctionnait les models sur CakePHP et je ne comprends toujours pas pourquoi on fait compliqué (Les ORM) au lieu de faire simple (Les requetes préparées).
Je dois vous paraître bête mais je comprends pas pourquoi on fait pas une méthode fetch dans Model comme ceci :
$this->fetch('SELECT field1, field2 FROM matable', array('data' => $data));
plutot que de se compliquer à faire
$this->matable->find('all',array('fields' => 'field1, field2', 'conditions' => ... ));
qui me semble pour moi du code en plus qui sert à rien...
Bref.... Désolé de paraître bête mais je trouve pas la réponse évidente ^_^ alors si quelqu'un pourrait m'éclaircir ?
En général un ORM te simplifie à la fois grandement le code et tu passe beaucoup moins de temps à chercher le nom des tables, des champs, ...
Par exemple je préfère faire
$post = Post::find($id);
plutôt qu'un truc du style
$sql = "SELECT * from posts WHERE post_id=$id";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$post = mysql_fetch_assoc($req)) ;
De plus tu peux facilement gérer les liaisons entre tables, règles de validations,...
Après oui il peut arriver que dans certains cas, il y a des conditions qui fassent que ca semble être inapproprié, mais c'est relativement rare.
L'ORM de CakePHP2 n'est pas le meilleur exemple car il est très verbeux mais par exemple si je veux un article et son utilisateur associé
$this->Post->find('all', ['contain' => ['User']]);
C'est plus simple que de faire la requête à la main. Il en est de même pour un update / delete. Après comme dans ton exemple effectivement il y aura certains cas ou tu devras faire la requête à la main car trop d'arguments. Dans ce cas là il ne faut pas hésite à sortir de l'ORM :)
Salut,
Moi j'utilise doctrine avec symfony 2, je trouve sa beaucoup plus facile vue que doctrine transforme ta table en class php.
Apres il est facile d'appeler une methode, ou de recuperer des données avec des Get ou de les modifiers avec des Set.
et en effet il est plus simple de faire Post->findAll(); que de ce taper a ecrire toutes la requetes et ce qui va avec.
@Graikart @lolotoobo
Pour les update et delete, je trouve en effet les ORM assez utiles mais les pour les SELECT, je comprends pas trop l'utilité :) car on a vite fait de se gourrer à oublier les parenthèses ou les crochets pour les tableaux (par exemple ci-dessous) alors qu'en SQL on l'écrit en 2 secondes vu qu'on maîtrise déja le SQL.
$this->Article->User->find('list', array('fields' => array('User.username', 'User.first_name'));
Après c'est vrai que pour séléctionner tout d'un coup, un simple findAll(); est utile ;)
Une dernière question : Utilisez vous parfois les requêtes préparées et pour quels types de requêtes ?
Comme la spécifié Grafikart la syntaxe est très lourde...
Moi je bosse simplement avec :
public function show($id, $limit) {
$cols = array('id', 'author', 'message', 'time', 'edit', 'vote');
$this->db->orderBy('time','asc');
$this->db->where('parent_topic', $id);
return $this->db->get(TABLE_POSTS, $limit, $cols);
}
je pourrais ne pas selectionner mes colones ni de limit et mettre juste le nom de ma table dans get() ca fonctionnerait...
L'idée c'est aussi de simplifier les requetes. Après c'est une préférence ou non...
toutes mes requêtes sont préparées.
Sans oublier que l'ORM permet de changer de SGBD rapidement si le site a respecté les conventions :)
Merci de toutes vos réponses qui m'ont éclaircit un peu plus sur les ORM car justement je trouve aussi que les syntaxes sont parfois trop lourdes et qu'on se facilite pas les choses parfois ;)
Merci à tous de m'avoir éclairci, chacun de vous m'a un petit peu aidé :D