Alors voilà je suis en train de crée un petit framework en mvc pour un projet et je voulais faire une class model qui ressemble à celle de cakephp 3 car je trouve la façon de faire une requête pas mal.
Ils font:
$this->Model->find('all')->select('id')->where(['id' => 2])
J'ai essayé de voir comment ils ont fait mais je comprends pas trop, car c'est une classe table qui appel une classe query mais je ne comprend pas comment la requête de lance.Voici ce que j'ai pour l'instant:
Model.php
<?php
class Model {
public $database = 'default';
public $table = false;
public $alias = false;
public function __construct() {
if($this->table === false) {
$this->table = strtolower(get_class($this));
}
if($this->alias === false) {
$this->alias = get_class($this);
}
}
public function find($type) {
$query = $this->query();
$query->select();
return $this->callFinder($type, $query);
}
private function query() {
return new Query($this);
}
public function callFinder($type, Query $query) {
$finder = 'find' . ucfirst($type);
if (method_exists($this, $finder)) {
return $this->{$finder}($query);
}
}
public function findAll(Query $query) {
echo '<pre>';
var_dump($query);
echo '</pre>';
return $query;
}
}
Query.php
<?php
class Query {
static $connect = [];
private $model;
private $pdo;
private $sql;
private $bind = [];
public function __construct($model) {
$this->model = $model;
if(isset(self::$connect[$this->model->database])) {
$this->pdo = self::$connect[$this->model->database];
return true;
}
$conf = Conf::$database[$this->model->database];
try {
$pdo = new PDO('mysql:host='.$conf['host'].';dbname='.$conf['dbname'].';', $conf['user'], $conf['pass'], [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
self::$connect[$this->model->database] = $pdo;
$this->pdo = $pdo;
} catch(PDOException $e) {
if(Config::$debug == 1) {
die($e->getMessage());
} else {
die('Impossible de se connecter à la base de donnée');
}
}
}
public function select($fields = null) {
if(!$fields) {
return $this;
}
$this->sql .= "SELECT ";
if(isset($fields)) {
$sql = '';
foreach ($fields as $field) {
$sql .= $this->model->table.'.'.$field.', ';
}
$this->sql .= substr($sql, 0, -2);
} else {
$this->sql .= "*";
}
$this->sql .= " FROM ".$this->model->table." as ".$this->model->alias;
return $this;
}
public function where($conditions) {
$this->sql .= " WHERE ";
$i = 0;
$sql = '';
foreach ($conditions as $key => $value) {
$sql .= ($i != 0) ? " AND " : '';
if(is_array($value)) {
$this->bind[$key] = $value[1];
$value = ' '.$value[0].' :'.$key;
} else {
$this->bind[$key] = $value;
$value = ' = :'.$key;
}
$sql .= $key.$value;
$i++;
}
$this->sql .= $sql;
return $this;
}
public function exec() {
var_dump($this->sql);
$query = $this->pdo->prepare($this->sql);
$query->execute($this->bind);
$res = $query->fetchAll(PDO::FETCH_OBJ);
return $res;
}
}
Donc comment doit-je faire pour exécuter ma fonction exec de query dans la fonction find de model?Merci d'avance....