Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Consulta objetos PHP

Estas en el tema de Consulta objetos PHP en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola , a ver si puedo explicar correctamente lo que quiero hacer. Supongamos que tengo una clase con db con varios metodos por ejemplo limit ...
  #1 (permalink)  
Antiguo 05/02/2012, 17:40
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Consulta objetos PHP

Hola , a ver si puedo explicar correctamente lo que quiero hacer.

Supongamos que tengo una clase con db con varios metodos por ejemplo limit y offset.

MI pregunta es la siguiente: existe alguna manera de poder saber cual es el ultimo metodo que se ejecuto en el objeto?

Lo que quiero poder hacer es lo siguiente :
$objeto->limit(); y que devuelva la consulta
$objeto->offset(); y que devuelva la consulta
$objeto->limit()->offset(); y que devuelva la consulta

No se si he podido explicarlo bien y si esto se puede hacer.

Muchas gracias

Saludos
  #2 (permalink)  
Antiguo 05/02/2012, 18:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Consulta objetos PHP

Me parece que no se puede hacer lo que dices, al menos no con métodos habituales.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 05/02/2012, 18:45
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Gracias por la respuesta igual, lo que quiero implementar es el active record de rails con php , estuve investigando pero no encuentro la forma de hacerlo igual.

Ha seguir investigando

Gracias
  #4 (permalink)  
Antiguo 05/02/2012, 19:07
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Consulta objetos PHP

Podrías mirar alguna de las librerías que implementan AR, Doctrine 1.x, Propel, phpactiverecord, etc.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 05/02/2012, 19:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Creo que a lo que te refieres es usar Method Chaining, eso lo obtienes devolviendo el objeto $this en tus consultas, ej:
Código PHP:
Ver original
  1. class FooBar
  2. {
  3.         private $_foo;
  4.         private $_bar;
  5.         public function foo()
  6.        {
  7.                $this->_foo = 'foo';
  8.                return $this;
  9.         }
  10.         public function bar()
  11.         {
  12.               $this->_bar = 'bar';
  13.               return $this;
  14.         }
  15.         public function __toString()
  16.         {
  17.                 return $this->_foo . $this->_bar;
  18.         }
  19. }
  20.  
  21. $foo = new FooBar();
  22. echo $foo->foo()->bar(); // foobar

Saludos.
  #6 (permalink)  
Antiguo 05/02/2012, 20:06
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Hola GatorV, no se si resuelve lo que quiero.

Código PHP:
Ver original
  1. class ar
  2. {
  3.         public function limit()
  4.        {
  5.              
  6.         }
  7.         public function offset()
  8.         {
  9.              
  10.         }
  11. }
  12.  
  13. $obj = new arr();
  14. $datos = $obj->limit(); // deberia devolver datos de una consulta con un limit
  15. $datos = $obj->offset(); // deberia devolver datos de una consulta con un offset
  16.  
  17. $datos = $obj->limit()->offset(); // deberia devolver datos de una consulta con un limit y un offset

Deberia saber el order en que se ejecutan los metodos en el objeto.

Saludos
  #7 (permalink)  
Antiguo 05/02/2012, 21:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Pues intenta usar el ejemplo que te mostré hace justamente eso.

Saludos.
  #8 (permalink)  
Antiguo 05/02/2012, 22:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Consulta objetos PHP

Cita:
Iniciado por mpiazzon Ver Mensaje
Deberia saber el order en que se ejecutan los metodos en el objeto.
Claro, aplicar el concepto de chain-methods no es complicado sin embargo conseguir la funcionalidad que exiges es de seguro imposible.

¿Por qué?

Tu estás buscando que cualquier método te devuelva la ejecución de la consulta, sólo que para eso debes casi adivinar cual fue el último método ejecutado y a partir de de ahí obtener el resultado de la consulta.

Creo que eso último no es posible, o al menos no se me ocurre como lo harías, voy a jugar un rato a ver si lo consigo y de ser así ¡gracias!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 05/02/2012, 22:50
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Exacto pateketrueke, para mi tampoco es posible pero se que en este foro hay gente que sabe mucho mas de php que yo y por eso quise preguntar.
Yo estuve jugando todo el dia a ver si se me ocurria algo, pero todavia nada que lo resuelva de la manera que quiero.

Gracias por las respuestas a los dos.

Saludos
  #10 (permalink)  
Antiguo 05/02/2012, 22:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Creo que lo que quiere hacer es algo como Zend_Db_Select, que puedes crear consultas al vuelo, internamente lo que hace es guardar diferentes partes del objeto las partes de la consulta y luego al usar __toString crea el objeto.
  #11 (permalink)  
Antiguo 05/02/2012, 22:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Revisa este ejemplo:
Código PHP:
Ver original
  1. <?php
  2. class Query
  3. {
  4.     private $_limit;
  5.     private $_offset;
  6.     private $_query;
  7.    
  8.     public function __construct()
  9.     {
  10.         $this->_query = 'SELECT * FROM foo';
  11.     }
  12.    
  13.     public function limit($results)
  14.     {
  15.         $this->_query .= " LIMIT $results";
  16.        
  17.         return $this;
  18.     }
  19.    
  20.     public function offset($results)
  21.     {
  22.         $this->_query .= " OFFSET $results";
  23.        
  24.         return $this;
  25.     }
  26.    
  27.     public function __toString()
  28.     {
  29.         return $this->_query;
  30.     }
  31. }
  32.  
  33. $query = new Query();
  34.  
  35. $query1 = clone $query;
  36. $query2 = clone $query;
  37. $query3 = clone $query;
  38. echo $query1->limit(10); // SELECT * FROM foo LIMIT 10
  39. echo $query2->offset(10); // SELECT * FROM foo OFFSET 10
  40. echo $query3->limit(10)->offset(10); // SELECT * FROM foo LIMIT 10 OFFSET 10

Saludos.
  #12 (permalink)  
Antiguo 05/02/2012, 23:03
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Muchas gracias GatorV por el interes, conocia Zend_Db_Select, la unica diferencia es que yo queria devolver los datos , no la consulta concatenada.

Código PHP:
Ver original
  1. $datos = $query->limit(10);
  2.  
  3. // en este caso $datos deberia tener la consulta realizada al igual que si hago
  4.  
  5. $datos = $query->limit(10)->offset(10);
  #13 (permalink)  
Antiguo 05/02/2012, 23:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Pues el segundo ejemplo que te puse hace eso, si quieres que "devuelva" la consulta, usa el operador (string) para forzar el uso de __toString().

Saludos.
  #14 (permalink)  
Antiguo 05/02/2012, 23:20
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

No puedo explicar bien lo que quiero.

En el 2 ejemplo:

echo $query3->limit(10)->offset(10); // SELECT * FROM foo LIMIT 10 OFFSET 10

devuelve la consulta, yo quiero que devuelva los datos, el array de objetos.

Necesitaria saber cual es el ultimo metodo , para asi realizar la consulta que fui concatenando.
  #15 (permalink)  
Antiguo 05/02/2012, 23:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

¿Te refieres a ejecutar ya la consulta en el RDBMS?
  #16 (permalink)  
Antiguo 05/02/2012, 23:35
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Si, te voy un ejemplo

Código PHP:
Ver original
  1. class ar
  2. {
  3.     public function exec($query) // retorna el array
  4.     {
  5.     }
  6.    
  7.     public function limit($param)
  8.     {
  9.          $query .= " LIMIT $param";
  10.          return $this->exec($query);
  11.     }
  12.     public function offset($param)
  13.     {
  14.          $query .= " offset $param";
  15.          return $this->exec($query);
  16.     }
  17.  
  18. }
  19.  
  20. $obj = new ar();
  21. $datos = $obj->limit(10); // todo ok
  22. $datos = $obj->offset(10); // todo ok
  23.  
  24. $datos = $obj->limit(10)->offset; // imposible
  25. $datos = $obj->offset(10)->limit; // imposible

Eso es lo que estoy intentando ver si se puede realizar.

Espero este mas claro con el ejemplo.

Nuevamente muchas gracias
  #17 (permalink)  
Antiguo 05/02/2012, 23:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Ah ya te entendí... no creo que exista una forma de hacerlo, ya que no hay control sobre cual fue el "último" método, tampoco puedes saber si vas a llamar a otro método, a lo mucho que puedes hacer me imagino es usar el método invoke para ejecutar la consulta, ejemplo:

Código PHP:
Ver original
  1. <?php
  2. class Query
  3. {
  4.     private $_limit;
  5.     private $_offset;
  6.     private $_query;
  7.    
  8.     public function __construct()
  9.     {
  10.         $this->_query = 'SELECT * FROM foo';
  11.     }
  12.    
  13.     public function limit($results)
  14.     {
  15.         $this->_query .= " LIMIT $results";
  16.        
  17.         return $this;
  18.     }
  19.    
  20.     public function offset($results)
  21.     {
  22.         $this->_query .= " OFFSET $results";
  23.        
  24.         return $this;
  25.     }
  26.    
  27.     public function __toString()
  28.     {
  29.         return $this->_query;
  30.     }
  31.    
  32.     public function __invoke()
  33.     {
  34.         $query = (string) $this->__toString();
  35.         echo "Executing $query";
  36.         return array();
  37.     }
  38. }
  39.  
  40. $query = new Query();
  41.  
  42. $query1 = clone $query;
  43. $query2 = clone $query;
  44. $query3 = clone $query;
  45. $query1->limit(10);
  46. $datos = $query1();
  47. var_dump($datos);
  48. $query2->offset(10);
  49. $datos = $query2();
  50. var_dump($datos);
  51. $query3->limit(10)->offset(10);
  52. $datos = $query3();
  53. var_dump($datos);
  #18 (permalink)  
Antiguo 05/02/2012, 23:54
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Muchas gracias, creo que por ahi puede estar la solucion.
  #19 (permalink)  
Antiguo 06/02/2012, 00:19
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Probando un poco esa no es la solucion a lo que buscaba, creo que es imposible hacerlo igual a rails.
  #20 (permalink)  
Antiguo 06/02/2012, 19:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Pues igual podrías usar alguna de las interfaces que trae PHP, como Iterator, o IteratorAggregate, que te permiten trabajar el objeto en un foreach() y ejecutar la consulta.

Saludos.
  #21 (permalink)  
Antiguo 06/02/2012, 20:38
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Hola GatorV, estuve jugando un poco con Iterator, pero no logre lo que queria.
  #22 (permalink)  
Antiguo 06/02/2012, 21:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Consulta objetos PHP

Pues algo así podría funcionar:
Código PHP:
Ver original
  1. <?php
  2. class Query implements Iterator
  3. {
  4.     private $_limit;
  5.     private $_offset;
  6.     private $_query;
  7.     private $_executed;
  8.     private $_sampleData = array(
  9.         'row1',
  10.         'row2',
  11.         'row3',
  12.         'row4',
  13.         'row5',
  14.         'row6',
  15.         'row7',
  16.         'row8',
  17.         'row9',
  18.         'row10'
  19.     );
  20.    
  21.     public $_position;
  22.    
  23.     public function __construct()
  24.     {
  25.         $this->_query = 'SELECT * FROM foo';
  26.         $this->_position = 0;
  27.         $this->_executed = false;
  28.     }
  29.    
  30.     public function limit($results)
  31.     {
  32.         $this->_query .= " LIMIT $results";
  33.        
  34.         return $this;
  35.     }
  36.    
  37.     public function offset($results)
  38.     {
  39.         $this->_query .= " OFFSET $results";
  40.        
  41.         return $this;
  42.     }
  43.    
  44.     public function __toString()
  45.     {
  46.         return $this->_query;
  47.     }
  48.    
  49.     public function __invoke()
  50.     {
  51.         $query = (string) $this->__toString();
  52.         echo "Executing $query";
  53.         $this->_position = 0;
  54.         $this->_executed = true;
  55.         return $this->_sampleData;
  56.     }
  57.    
  58.     public function isExecuted()
  59.     {
  60.         return $this->_executed;
  61.     }
  62.    
  63.     public function execQuery()
  64.     {
  65.         $query = $this->__toString();
  66.         echo "Executing $query";
  67.         $this->_position = 0;
  68.         $this->_executed = true;
  69.     }
  70.    
  71.     public function rewind()
  72.     {
  73.         if (!$this->isExecuted()) {
  74.             $this->execQuery();
  75.         }
  76.         $this->_position = 0;
  77.     }
  78.    
  79.     public function current()
  80.     {
  81.         return $this->_sampleData[$this->_position];
  82.     }
  83.    
  84.     public function key()
  85.     {
  86.         return $this->_position;
  87.     }
  88.    
  89.     public function next()
  90.     {
  91.         ++$this->_position;
  92.     }
  93.    
  94.     public function valid()
  95.     {
  96.         return isset($this->_sampleData[$this->_position]);
  97.     }
  98. }
  99.  
  100. $query = new Query();
  101.  
  102. $query1 = clone $query;
  103. $query2 = clone $query;
  104. $query3 = clone $query;
  105. foreach($query1->limit(10) as $data) {
  106.     var_dump($data);
  107. }
  108. foreach($query1->limit(10) as $data) {
  109.     var_dump($data);
  110. }
  111. foreach($query2->offset(10) as $data) {
  112.     var_dump($data);
  113. }
  114. foreach ($query3->limit(10)->offset(10) as $data) {
  115.     var_dump($data);
  116. }
  #23 (permalink)  
Antiguo 07/02/2012, 20:46
 
Fecha de Ingreso: octubre-2008
Ubicación: Mar del Plata
Mensajes: 50
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Consulta objetos PHP

Voy a probar a ver si lo consigo!
Graciassss

Etiquetas: clase, objetos, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:24.