Sunteți pe pagina 1din 16

10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Envato Elements Unlimited downloads. Only $29/Month 

Advertisement

CODE > YII

Cómo Programar Con Yii2: ActiveRecord


by Jeff Reifman 6 Mar 2017
Di culty: Intermediate Length: Medium Languages: Español

Yii PHP ActiveRecord Databases Relational Databases MySQL SQL



This post is part of a series called How to Program With Yii2.

 Programming With Yii2: Automated Testing With Codeception

 How to Program With Yii2: Running Cron Services

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 1/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

What You'll Be Creating

Si te estás preguntando: "Qué es Yii?" Revisa mi tutorial anterior Introducción al


Framework Yii, que revisa los bene cios de Yii e incluye una vista general de los cambios
en Yii 2.0, liberado en Octubre de 2014.

En esta serie Programando Con Yii2, estaré guiando a los lectores en el uso del
Framework Yii2 para PHP. En el tutorial de hoy, te guiaré en el uso del mapeo objeto-
relacional, conocido como ORM, para trabajar con bases de datos. Es llamado
ActiveRecord y es un aspecto clave de programar aplicaciones de base de datos
e cientemente en Yii.
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 2/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Yii ofrece diferentes maneras de trabajar con tu base de datos de manera programática,
tales como consultas directas y un constructor de consulta, pero usar ActiveRecord
ofrece un conjunto completo de bene cios para programación de base de datos orientada
a objetos. Tu trabajo se vuelve más e ciente, más seguro, trabaja dentro de la arquitectura
modelo vista controlador de Yii, y es portable si decides cambiar plataformas de base de
datos (ej. MySQL a PostgreSQL).

Sigue a la par mientras detallo los básicos de Active Record dentro de Yii.

Solo un recordatorio, participo en la sección de comentarios de abajo. Estoy


especialmente interesado si tienes diferentes aproximaciones, ideas adicionales, o
quieres sugerir temas para tutoriales futuros. Si tienes una pregunta o sugerencia de
tema, por favor publicalo abajo. También puedes contactarme en Twitter @reifman
directamente.

¿Qué Es Active Record?


El modelo vista controlador de Yii es uno de sus bene cios clave. Active Record
proporciona una solución orientada a objetos para trabajar con tus bases de datos que
está integrada cercanamente con modelos Yii. De acuerdo a Wikipedia, el término general
Active Record fue "nombrado por Martin Fowler en su libro de 2003, Patterns of Enterprise
Application Architecture."

La documentación Yii resume esto concisamente:

Una clase Active Record es asociada con una tabla de base de
datos, una instancia Active Record corresponde a una fila de esa
tabla, y un atributo de una instancia Active Record representa el
valor de una columna particular en esa fila. En vez de escribir
declaraciones SQL crudas, podrías acceder atributos Active Record
y llamar métodos Active Record para acceder y manipular la
información almacenada en tablas de base de datos.

La integración del patrón Active Record en Yii es una gran fortaleza del framework, pero
común en la mayoría de frameworks tales como Ruby on Rails.
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 3/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Esta abstracción de modelos a tablas de base de datos permite al framework realizar la


parte pesada de la seguridad en todos lados, ej. desglosar consultas SQL injection.

El soporte Active Record de Yii también proporciona portabilidad a lo largo de un número


de bases de datos. Puedes cambiar bases de datos sin necesitar cambiar mucho código:

MySQL 4.1 o superior


PostgreSQL 7.3 o superior
SQLite 2 y 3
Microsoft SQL Server 2008 o superior
CUBRID 9.3 o superior
Oracle
Sphinx: via yii\sphinx\ActiveRecord, requiere la extensión  yii2‐sphinx
ElasticSearch: via yii\elasticsearch\ActiveRecord, requiere la extensión  yii2‐
elasticsearch

Y las siguientes bases de datos NoSQL

Redis 2.6.12 o superior: via yii\redis\ActiveRecord, requiere la extensión yii2‐redis

MongoDB 1.3.0 o superior: via yii\mongodb\ActiveRecord requiere la extensión  yii2‐


mongodb

Aprendiendo los Básicos


En el episodio anterior, Cómo Programar Con Yii2: Trabajando Con la Base de Datos y
Active Record, fui a través de crear tu base de datos, cómo Yii se conecta a esta para
cada sesión, usando una migración para crear tablas de base de datos, y usar Gii (el útil
generador de scaffolding de Yii) para crear código modelo por defecto. Si no estás
familiarizado con nada de esto, por favor revisa ese episodio.

En este episodio, me enfocaré más en aprovechar Active Record en tu código.

Declarando una Clase Active Record en un Modelo

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 4/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Primero, déjame revisar como transformar un modelo Yii para sacar partido de Active
Record. Usaré un modelo de ejemplo que creé en la serie Construyendo tu Startup. Esa
serie te guía en cómo estoy construyendo mi startup, Plani cador de Reuniones, en Yii2.

Usaré el ejemplo de un modelo simple que creé llamado Launch, que permite a los
visitantes de la página principal proporcionar su dirección de correo si quieren ser
noti cados cuando el producto salga de la vista previa y sea liberado completamente.

Usando Active Record con un modelo es bastante simple; nota la  class Launch extends
\yii\db\ActiveRecord :

01 <?php
02  
03 namespace frontend\models;
04  
05 use Yii;
06 use yii\db\ActiveRecord;
07  
08  
09 /**
10  * This is the model class for table "launch".
11  *

 * @property integer $id
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 5/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

12  * @property integer $id
13  * @property string $email
14  * @property string $ip_addr
15  * @property integer $status
16  * @property integer $created_at
17  * @property integer $updated_at
18  */
19 class Launch extends \yii\db\ActiveRecord
20 {
21   const STATUS_REQUEST =0;
22     /**
23      * @inheritdoc
24      */
25     public static function tableName()
26     {
27         return 'launch';
28     }

Eso es todo.

Construyendo Consultas
Veamos algunas consultas Active Record comunes.

Registros Individuales

Si tienes un ID de registro, frecuentemente un parámetro de consulta de un controlador, es


fácil encontrar el registro que quieres:

1 public function actionSomething($id)
2 {
3   $model = Launch::findOne($id);

Esto es idéntico a:

1 $model = Launch::find()
2     ‐>where(['id' => $id])
3     ‐>one();

También puedes extender el arreglo ‐>where con más campos o condiciones booleanas:

01 $model = Launch::find()
02     ‐>where(['id' => $id,'status'=>Launch::ACTIVE_REQUEST])
03     ...
04      
05 //equivalent to
06 $model = Launch::find()
    ‐>where(['id' => $id)
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 6/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

07     ‐>where(['id' => $id)
08     ‐>andWhere(['status'=>Launch::ACTIVE_REQUEST])
09     ‐>orWhere(['status'=>Launch::FUTURE_REQUEST])
10     ...

Registros Múltiples

Aquí hay un ejemplo de encontrar todos los registros que empaten un status especí co
ordenado por $id :

1 $people = Launch::find()
2   ‐>where(['status' => Launch::STATUS_REQUEST])
3   ‐>orderBy('id')
4   ‐>all();

El ‐>all(); encuentra todos los registros en lugar de solo uno. La variable $people es
devuelta como un arreglo de objetos de modelo. De manera alternativa, cuando no hay
condiciones, puedes acceder a todos los registros con ‐>findAll();

Devolviendo un Arreglo

Usar indexBy devuelve un arreglo de elementos indexados por su id :

1 $people = Launch::find()
2     ‐>indexBy('id')
3     ‐>all();

De manera alternativa, puedes devolver un arreglo asociativo con ‐>asArray() :

1 $people = Launch::find()
2     ‐>asArray()
3     ‐>all();

Nota: La documentación de Yii dice, "Mientras este método guarda memoria y mejora
desempeño, es más cercano a la capa de abstracción DB más baja y perderás la mayoría
de características Active Record."

Contando Registros

También puedes devolver solo un count desde una consulta:

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 7/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

1 $count = Launch::find()
2     ‐>where(['status' => Launch::STATUS_REQUEST])
3     ‐>count();

Uso contadores mucho en Plani cador de Reunión para estadísticas por ejemplo; aprende
más en nuestro episodio Dashboard:

1 // calculate  $count_meetings_completed
2 $hd‐>count_meetings_completed = Meeting::find()‐>where(['status'=>Meeting::STATUS_COMPLETED])‐
3 // calculate  $count_meetings_expired
4 $hd‐>count_meetings_expired = Meeting::find()‐>where(['status'=>Meeting::STATUS_EXPIRED])‐>and
5 // calculate  $count_meetings_planning
6 $hd‐>count_meetings_planning = Meeting::find()‐>where('status<'.Meeting::STATUS_COMPLETED)‐>an
7 // calculate  $count_places
8 $hd‐>count_places = Place::find()‐>where('created_at>'.$after)‐>andWhere('created_at<'.$since

Accediendo a los Datos


Una vez que has solicitado los datos, como un modelo individual, es sencillo acceder a los
datos como un objeto modelo:

1 $model = Launch::findOne($id);  
2 $id = $model‐>id;
3 $email = $model‐>email;

Frecuentemente proceso arreglos de esta manera:

1 $users = User::findAll();
2 foreach ($users as $u) {
3  $id = $u‐>id;
4  $email = $u‐>email;

Asignación Masiva
También puedes asignar rápidamente un arreglo a un registro modelo vía ActiveRecord:

1 $values = [
2     'name' => 'James',
3     'email' => 'james@example.com',
4 ];
5 $customer = new Customer();
6 $customer‐>attributes = $values;
7 $customer‐>save();

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 8/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Esto es frecuentemente usado para poblar datos de modelo después de un envío de


formulario:

1 if (isset($_POST['FormName'])) {
2     $model‐>attributes = $_POST['FormName'];
3     if ($model‐>save()) {
4         // handle success
5     }
6 }

O puedes usar ‐>load() para esto:

1 if ($model‐>load(Yii::$app‐>request‐>post()) && $model‐>save()) {
2 ...
3 }

El generador de scaffolding Gii de Yii es grandioso generando modelos usando


ActiveRecord que hace mucho de esto por ti, ej. modelos, controladores, formularios,
vistas, etc.

Guardando Datos
Como puedes ver arriba, guardar datos con Active Record es sencillo también. En este
ejemplo de la documentación Yii, un nuevo registro es creado y guardado---y después el
registro es cargado por id, y las actualizaciones son guardadas:

01 // insert a new row of data
02 $customer = new Customer();
03 $customer‐>name = 'James';
04 $customer‐>email = 'james@example.com';
05 $customer‐>save();
06  
07 // update an existing row of data
08 $customer = Customer::findOne(123);
09 $customer‐>email = 'james@newexample.com';
10 $customer‐>save();

Borrando Registros
Borrando un registro es incluso más fácil:

1 $u = User::findOne(99);
2 $u‐>delete();

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 9/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Actualizando Contadores
Yii también ofrece incrementos de contadores. Digamos que un usuario programa otra
reunión, y estoy dando seguimiento a cuantos en la tabla usuario:

1 $u = User::findOne(99);
2 $u‐>updateCounters(['meeting_count'=>1]);
3 // equivalent to
4 // UPDATE `User` SET `meeting_count` = `meeting_count` + 1 WHERE `id` = 99

Relaciones
Conectando tablas a lo largos de índices es una de las capacidades más poderosas de
Active Record. Por ejemplo, en Plani cador de Reuniones, cada reunión podría tener 0 o
más MeetingPlaces . El modelo Meeting.php de ne un ActiveQuery relacional para esto:

1 * @property MeetingPlace[] $meetingPlaces
2 /**
3  * @return \yii\db\ActiveQuery
4  */
5 public function getMeetingPlaces()
6 {
7     return $this‐>hasMany(MeetingPlace::className(), ['meeting_id' => 'id']);
8 }

Después, puedo acceder a todos los lugares de reunión con la propiedad $meetingPlaces .
Abajo, cargo una reunión e itero sobre todos sus meetingPlaces bastante sencillo ya que
fue un arreglo de sub-objetos integrado.

1 $mtg=Meeting::find()‐>where(['id'=>$meeting_id])‐>one();
2 foreach ($mtg‐>meetingPlaces as $mp) {
3   ...
4 }

Por supuesto, esto depende en crear una llave exterior cuando creas la tabla en su
migración:

01 $this‐>createTable('{{%meeting_place}}', [
02           'id' => Schema::TYPE_PK,
03           'meeting_id' => Schema::TYPE_INTEGER.' NOT NULL',
04           'place_id' => Schema::TYPE_INTEGER.' NOT NULL',
05           'suggested_by' => Schema::TYPE_BIGINT.' NOT NULL',
06           'status' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 0',
07           'created_at' => Schema::TYPE_INTEGER . ' NOT NULL',
          'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL',
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 10/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

08           'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL',
09       ], $tableOptions);
10       $this‐>addForeignKey('fk_meeting_place_meeting',
11         '{{%meeting_place}}', 'meeting_id', '{{%meeting}}',
12         'id', 'CASCADE', 'CASCADE');

THE ONLY WORDPRESS
THEME YOU'LL EVER NEED!

Advertisement

Qué Sigue
Espero que esto te haya proporcionado una introducción sencilla de algunas de las
genialidades de Active Record. También incluye Ciclos de Vida, Transacciones, y Bloqueo,
sobre lo que podría escribir en el futuro. Si quieres continuar, Yii2 ofrece dos grandes
áreas para aprender más en su documentaicón: Guía Yii2 para Active Record y
Especi caciones funcionales Yii2 Active Record. Estas son introducciones bien escritas.

Espera futuros tutoriales en la serie Programando Con Yii2 mientras continuamos


sumergiéndonos en diferentes aspectos del framework. Podrías también querer revisar la
antes mencionada serie Construyendo Tu Startup Con PHP.

Si quisieras saber cuando llega el siguiente tutorial Yii2, sígueme en Twitter @reifman o
revisa mi página de instructor.

Enlaces Relacionados
https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 11/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Cómo Programar Con Yii2: Trabajando Con la Base de Datos y Active Record (Envato
Tuts+)
Guía Yii2 para Active Record
Especi cación Funcional Yii2 Active Record
Patrón Active Record (Wikipedia)
Intercambio de Desarrollador Yii2, mi sitio de recursos Yii2

Advertisement

Jeff Reifman
Entrepreneur, technology writer

Jeff Reifman is a experienced technology consultant, former Microsoft Group


Program Manager, writer, activist and yogi. He's the founder of Meeting Planner and
author of the Envato Tuts+ series, Building Your Startup. He enjoys travel,
photography and snowboarding in his free time.

 lookahead_io

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 12/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Weekly email summary


Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on
learning about the next big thing.

Email Address

Update me weekly

Advertisement

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 13/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Translations

Envato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!

Translate this post

Powered by

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 14/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Sponsored Links

Best Tracking Device Ever is Selling Like Crazy
TrackR Bravo

The 20 Most Generous Billionaires In The World
AfriZap

That's How You Find Cheap Flights
tripsinsider.com

Photos Inside Ivanka Trump's New Home Will Leave You Speechless
LifeDaily.com

Crazy Cheap Lighter Is Selling Like Hotcakes
Inferno Lighter

How a TOTAL beginner can speak a new language in just 3 weeks!
Babbel

0 Comments Tuts+ Hub 
1  Login

  Recommend ⤤ Share Sort by Best

Start the discussion…

Be the first to comment.

✉ Subscribe d Add Disqus to your siteAdd DisqusAdd ὑ Privacy

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 15/16
10/5/2017 Cómo Programar Con Yii2: ActiveRecord

Advertisement

ENVATO TUTS+ 

JOIN OUR COMMUNITY 

HELP 

23,814 1,010 10,125


Tutorials Courses Translations

Envato.com Our products Careers

© 2017 Envato Pty Ltd. Trademarks and brands are the property of their respective owners.

Follow Envato Tuts+

https://code.tutsplus.com/es/tutorials/how­to­program­with­yii2­active­record­­cms­27434 16/16

S-ar putea să vă placă și