Recuperar datos

find

find($tipo, $parametros)

$tipo es 'all', 'first', 'count', 'neighbors', 'list' o 'threaded'. 'first' es el tipo de búsqueda predeterminado.

$parametros es un array con cualquiera de las siguientes opciones disponibles como claves:

array(
    'conditions' => array('Model.field' => $thisValue), //array de condiciones
    'recursive' => 1, //int
    'fields' => array('Model.field1', 'Model.field2'), //array de nombres de campos
    'order' => 'Model.created', //string o array definiendo el orden
    'group' => array('Model.field'), //campos para GROUP BY
    'limit' => n, //int
    'page' => n //int
)

find(‘first’)

find(‘first’, $params)

‘first’ es el tipo find por defecto, y devolverá un solo resultado, deberías utilizar esto para cualquier caso donde esperes solo un resultado.

find(‘count’)

find('count', $params)

find('count', $params) Devuelve un valor entero.

find(‘all’)

find('all', $params)

find('all')devuelve un array de resultados(potencialmente multiple); es, de hecho, el mecanismo usado por todas las variantes del método find(), como por ejemplo para paginar.

find(‘list’)

find('list', $params)

find('list', $params) Devuelve un array indexado, útil para cualquier uso donde podrías querer una lista como los polulares campos select de los formularios

find(‘neighbors’)

find('neighbors', $params)

‘neighbors’ realiza una búsqueda similar a ‘first’, a diferencia que devuelve el registro precedente y posterior del solicitado.

query

query(string $consulta)

Se pueden realizar llamadas SQL personalizadas usando el método query() del modelo.

Todas las tablas del ejemplo Blog

CREATE TABLE posts (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

/* Then insert some posts for testing: */
INSERT INTO posts (title, body, created)
    VALUES ('The title', 'This is the post body.', NOW());
INSERT INTO posts (title, body, created)
    VALUES ('A title once again', 'And the post body follows.', NOW());
INSERT INTO posts (title, body, created)
    VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());
CREATE TABLE comments ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, subject VARCHAR(50), body VARCHAR(1500), post_id int, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); /* algunos valores de test */ INSERT INTO comments (subject,body,post_id,created) VALUES ('Good','Good article',1, NOW()); INSERT INTO comments (subject,body,post_id,created) VALUES ('What?','I don\'t understand',2, NOW()); INSERT INTO comments (subject,body,post_id,created) VALUES ('ola','ola k ase??',3, NOW());

CREATE TABLE themes (
 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 title VARCHAR(50),
 created DATETIME DEFAULT NULL,
 modified DATETIME DEFAULT NULL
);


/* algunos valores de test */
INSERT INTO themes (title,created)
 VALUES ('MVC', NOW());
INSERT INTO themes (title,created)
 VALUES ('cakePHP', NOW());
INSERT INTO themes (title,created)
 VALUES ('Depression', NOW());
CREATE TABLE tags (
 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 tag VARCHAR(50),
 created DATETIME DEFAULT NULL,
 modified DATETIME DEFAULT NULL
);


/* algunos valores de test */
INSERT INTO tags (tag,created)
 VALUES ('MVC', NOW());
INSERT INTO tags (tag,created)
 VALUES ('CakePHP', NOW());
INSERT INTO tags (tag,created)
 VALUES ('JS', NOW());

CREATE TABLE posts_tags (
 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 post_id INT,
 tag_id INT
);

Scaffold y Bake

Hasta la versión 3.0 de cakePHP se puede hacer ‘scaffold’ en los controladores. ¿Qué es esto? Es poner un ‘andamiaje’ que proporciona las funcionalidades básicas de altas, bajas y modificaciones (CRUD).

Para hacerlo basta poner en el controlador lo siguiente:

var $scaffold;

Y automáticamente, si el modelo está bien, obtenemos el entorno para manejar los datos.

En la versión 3.0 se ha eliminado por falta de uso. Es comprensible, ya que si queremos obtener la funcionalidad básica podemos hacerlo vía bake.

Para conseguirlo necesitamos tener en el path del sistema la ruta al php. Por ejemplo:

SET PATH=%PATH%;C:\xampp\php

Añadimos también la siguiente ruta;

Ruta de mi cake\app\Console\

Ejemplo:

C:\xampp\htdocs\cakeblog\app\Console

Colocarnos en la carpeta de la aplicación y ejecutar:

Ruta de mi cake\app\cake bake

Ejemplo:

c:\xampp\htdocs\cakeblog\app\cake bake

O

Ruta de mi cake\app\cake bake all

Esto nos genera modelos, vistas y controladores con toda la funcionalidad, listos para usar y modificar.

 

Ejemplo:

cd c:\xampp\htdocs\cakeblog\app

c:\xampp\htdocs\cakeblog\app\cake bake

c:\xampp\htdocs\cakeblog\app\cake bake all

Ejercicio: Mantenimiento tabla Themes

Añadamos la tabla themes a la base de datos y realicemos el mantenimiento:

CREATE TABLE themes (
 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 title VARCHAR(50),
 created DATETIME DEFAULT NULL,
 modified DATETIME DEFAULT NULL
);


/* algunos valores de test */
INSERT INTO themes (title,created)
 VALUES ('MVC', NOW());
INSERT INTO themes (title,created)
 VALUES ('cakePHP', NOW());
INSERT INTO themes (title,created)
 VALUES ('Depression', NOW());

Acción edit y vista

 public function edit($id = null) {
 //Parte donde se recuperan los datos enviados por la vista y se guardan en la BD
 if ($this->request->is(array('post', 'put'))) {
 if ($this->Post->save($this->request->data)) {
 $this->Flash->success(__('Post actualizado.'));
 return $this->redirect(array('action' => 'index'));
 }
 $this->Flash->error(__('Unable to update your post.'));
 } else {
 //Parte donde se recupera el Post y se manda a la vista
 if (!$id) {
 throw new NotFoundException(__('Invalid post'));
 }

 $post = $this->Post->findById($id);
 if (!$post) {
 throw new NotFoundException(__('Invalid post'));
 }

 if (!$this->request->data) {
 $this->request->data = $post;
 }
 }
 }
 <h1>Edit Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('Save Post');
?>

Convenciones de nombres en cakephp

Aquí tenemos la lista de convenciones de nombres:

Convenciones de nombres en cakephp

Hay un problema. CakePHP cambia del plural al singular en controladores/modelos, y si tenemos una tabla como ‘Autores’ nos generará un modelo llamado ‘Autore’. Esto tiene dos soluciones, usar en estos casos un plural inglés en las tablas (autors) o añadir un par de líneas en /app/Config/bootstrap.php:

Inflector::rules('singular', array('rules' => array('/(.*)res$/i' => '\1r', '/(.*)nes$/i' => '\1n', '/(.*)des$/i' => '\1d', '/(.*)ses$/i' => '\1s'), 'irregular' => array(), 'uninflected' => array()));
Inflector::rules('plural', array('rules' => array('/(.*)r$/i' => '\1res', '/(.*)n$/i' => '\1nes', '/(.*)d$/i' => '\1des', '/(.*)s$/i' => '\1ses'), 'irregular' => array(), 'uninflected' => array() ) );
Visto aquí:

Rutas en CakePHP

Las rutas en cakephp tienen un formato definido:

http://example.com/controlador/accion/param1/param2/param3

Aunque también se pueden usar parámetros con nombres:

Ejemplos de todo:

URL: /monos/saltar
Dirige a: MonosController->saltar();

URL: /productos
Dirige a: ProductosController->index();

URL: /tareas/ver/45
Dirige a: TareasController->ver(45);

URL: /donaciones/ver/recientes/2001
Dirige a: DonacionesController->ver('recientes', '2001');

URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones
Dirige a: ContenidosController->ver();
$this->passedArgs['capitulo'] = 'modelos';
$this->passedArgs['seccion'] = 'asociaciones';

Utilizar otra vista para renderizar una acción

En cakePHP se busca por defecto para cada acción la vista que tenga su nombre. Pero podemos indicar que use una vista concreta. Por ejemplo podemos tener lo siguiente en el controlador:

 public function suma($a,$b){
 $this->set('resultado',$a+$b);
 $this->render('/Prueba/resultado');
 }

 public function mayor($a,$b){
 if ($a<$b) $a=$b;
 $this->set('resultado',$a);
 $this->render('/Prueba/resultado');
 }

Y la siguiente vista:

// archivo \Prueba\resultado.ctp

<h2>El resultado es <?=$resultado?></h2>