Cómo programar con Yii2: Trabajar con la base de datos y Active Record
Spanish (Español) translation by Elías Nicolás (you can also view the original English article)



Si se está preguntando, "¿Qué es Yii?" Echa un vistazo a mi tutorial anterior: Introducción a Yii Framework, que revisa los beneficios de Yii e incluye una visión general de lo que es nuevo en Yii 2.0, lanzado el 12 de octubre de 2014.
En la programando con Yii2: Primeros pasos, configuramos Yii2 localmente, construimos una aplicación Hello World, configuramos un servidor remoto y usamos GitHub para desplegar nuestro código. En la segunda parte, aprendimos sobre la implementación de Yii de su arquitectura Model View Controller y cómo construir páginas web y formularios que recopilen y validen datos. En este tutorial, usaremos la base de datos de Yii y las capacidades de registro activo para automatizar la generación de código para una aplicación web básica.
Para estos ejemplos, seguiremos imaginando que estamos construyendo un marco para publicar actualizaciones de estado simples, p. Nuestro propio mini-Twitter.
1. Crear su base de datos
Primero, necesitamos crear una base de datos en nuestro entorno de desarrollo. Lo hago a través de la interfaz de usuario web PHPMyAdmin de MAMP. Navegue hasta PHPMyAdmin, p. http://localhost:8888/MAMP/index.php?page=phpmyadmin, elija la
pestaña Bases de Datos y cree una base de datos llamada hello:



También puede utilizar la interfaz de línea de comandos de MySQL.
Ahora, proporcionaremos credenciales de bases de datos al archivo de configuración de la base de datos de Yii. Abra /hello/config/db.php y proporcione sus credenciales de base de datos MySQL. El mío se ve asi:
1 |
<?php
|
2 |
|
3 |
return [ |
4 |
'class' => 'yii\db\Connection', |
5 |
'dsn' => 'mysql:host=localhost;dbname=hello', |
6 |
'username' => 'root', |
7 |
'password' => 'password', |
8 |
'charset' => 'utf8', |
9 |
];
|
Ahora, crearemos nuestra primera migración de base de datos. Una migración proporciona una forma programática de crear y actualizar esquemas de base de datos. Es especialmente útil si está ejecutándose en varios servidores o en diferentes entornos. Elimina la dificultad de importar scripts SQL.
Para nuestros ejemplos de codificación, puede utilizar el repositorio de Git del último tutorial para seguirlo, o puedes descargar el repositorio completo aquí.
Crear la migración
Nuestra primera migración creará la tabla Status. Abra Terminal e introduzca lo siguiente:
1 |
cd ~/Sites/hello
|
2 |
./yii migrate/create create_status_table |
Debe ser así, cuando haya terminado:



Cuando abra \hello\migrations, verá un archivo llamado similar a m141201_013120_create_status_table.php. Debe tener este aspecto cuando se abre:
1 |
<?php
|
2 |
|
3 |
use yii\db\Schema; |
4 |
use yii\db\Migration; |
5 |
|
6 |
class m141201_013120_create_status_table extends Migration |
7 |
{
|
8 |
public function up() |
9 |
{
|
10 |
|
11 |
}
|
12 |
|
13 |
public function down() |
14 |
{
|
15 |
echo "m141201_013120_create_status_table cannot be reverted.\n"; |
16 |
|
17 |
return false; |
18 |
}
|
19 |
}
|
Este es el código de migración predeterminado que proporciona Yii. A continuación, lo actualizaremos para proporcionar los campos que necesitamos.
Creación de la tabla Status
Nuestra tabla Status almacenará el texto del mensaje y especificará si una publicación es privada o pública. Cada fila también tendrá un id, campos de tiempo de creacion y actualizacion.
Actualice el código de migración al nuestro:
1 |
public function up() |
2 |
{
|
3 |
$tableOptions = null; |
4 |
if ($this->db->driverName === 'mysql') { |
5 |
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; |
6 |
}
|
7 |
|
8 |
$this->createTable('{{%status}}', [ |
9 |
'id' => Schema::TYPE_PK, |
10 |
'message' => Schema::TYPE_TEXT.' NOT NULL DEFAULT ""', |
11 |
'permissions' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 0', |
12 |
'created_at' => Schema::TYPE_INTEGER . ' NOT NULL', |
13 |
'updated_at' => Schema::TYPE_INTEGER . ' NOT NULL', |
14 |
], $tableOptions); |
15 |
}
|
16 |
|
17 |
|
18 |
public function down() |
19 |
{
|
20 |
$this->dropTable('{{%status}}'); |
21 |
}
|
Observe cómo hemos agregado definiciones para los campos que necesitamos como message, permissions, created_at y updated_at.
Ejecutar la migración
Para indicar a Yii que cree la tabla, debemos ejecutar la migración. Es fácil. De Terminal otra vez, ejecutamos ./yii migrate/up:
1 |
$ ./yii migrate/up
|
2 |
Yii Migration Tool (based on Yii v2.0.0) |
3 |
|
4 |
Total 1 new migration to be applied: |
5 |
m141201_013120_create_status_table |
6 |
|
7 |
Apply the above migration? (yes|no) [no]:yes |
8 |
*** applying m141201_013120_create_status_table
|
9 |
> create table {{%status}} ... done (time: 0.032s) |
10 |
*** applied m141201_013120_create_status_table (time: 0.038s) |
11 |
|
12 |
|
13 |
Migrated up successfully. |
Si navegas por la tabla usando PHPMyAdmin, deberías ver algo como esto:



Ahora que hemos creado la tabla de la base de datos, podemos empezar a usar Gii, el potente generador de scaffolding de Yii, para automatizar todo el código del controlador de vista de modelo.
2. Usando Gii: El generador de código Yii
Gii es el generador de código scaffolding de Yii. Utiliza su conocimiento del esquema de la base de datos para generar un código de controlador de vista de modelo predeterminado y bien escrito para su aplicación. Gii puede convertir un esquema de base de datos en una aplicación web básica de trabajo en cuestión de minutos. Es increíblemente poderoso. Dejame mostrarte como funciona.
Construyendo el Modelo
Con Gii, comenzamos construyendo un modelo basado en cada tabla de base de datos que hemos creado. Para nuestro ejemplo, usaremos la tabla Status.
Para comenzar a usar Gii, vaya a su aplicación web y agregue /gii, p. http://localhost:8888/hello/web/gii. Verás algo como esto:



Haga clic en Model Generator e ingrese status en el campo Table Name:



Al hacer clic en Preview, mostrará qué archivos se creará. Dado que ya tenemos un archivo de modelo Status.php del último tutorial, haz clic en Overwrite. A continuación, haga clic en Generate.



El resultado se verá algo así:



Abra
el archivo /hello/models/Status.php y verá las reglas básicas de
validación y los atributos de formulario que Yii ha creado para
nosotros:
1 |
<?php
|
2 |
|
3 |
namespace app\models; |
4 |
|
5 |
use Yii; |
6 |
|
7 |
/**
|
8 |
* This is the model class for table "status".
|
9 |
*
|
10 |
* @property integer $id
|
11 |
* @property string $message
|
12 |
* @property integer $permissions
|
13 |
* @property integer $created_at
|
14 |
* @property integer $updated_at
|
15 |
*/
|
16 |
class Status extends \yii\db\ActiveRecord |
17 |
{
|
18 |
/**
|
19 |
* @inheritdoc
|
20 |
*/
|
21 |
public static function tableName() |
22 |
{
|
23 |
return 'status'; |
24 |
}
|
25 |
|
26 |
/**
|
27 |
* @inheritdoc
|
28 |
*/
|
29 |
public function rules() |
30 |
{
|
31 |
return [ |
32 |
[['message', 'created_at', 'updated_at'], 'required'], |
33 |
[['message'], 'string'], |
34 |
[['permissions', 'created_at', 'updated_at'], 'integer'] |
35 |
];
|
36 |
}
|
37 |
|
38 |
/**
|
39 |
* @inheritdoc
|
40 |
*/
|
41 |
public function attributeLabels() |
42 |
{
|
43 |
return [ |
44 |
'id' => 'ID', |
45 |
'message' => 'Message', |
46 |
'permissions' => 'Permissions', |
47 |
'created_at' => 'Created At', |
48 |
'updated_at' => 'Updated At', |
49 |
];
|
50 |
}
|
51 |
}
|
Creación de la Interfaz Web
Ahora, es hora de usar Gii para construir el controlador y las vistas para la tabla Status. Vuelva a la página principal de Gii y haga clic en CRUD Generator, p. http://localhost:8888/hello/web/gii/crud:
Para Model Class, ingrese app\models\Status (estas entradas distinguen entre mayúsculas y minúsculas). Para Search Model Class, ingrese app\models\StatusSearch. Para Controller Class, ingrese app\controllers\StatusController. Debe verse asi:



Haga clic Preview. Verás lo siguiente—asegúrate de hacer clic en Overwrite de nuevo, ya que tenemos archivos antiguos del último tutorial que deben actualizarse:



Al hacer clic en Generate, verá todo el controlador y verá los archivos generados:



Las páginas CRUD predeterminadas
Navegue por su navegador a http://localhost:8888/hello/web/status, y verá la página de índice CRUD generada. Dado que todavía no hay filas en la base de datos, aparecerá vacía.



Ahora, haga clic en Create Status y verá el formulario de estado de creación predeterminado creado por Gii:



Es bastante sorprendente cómo rápidamente Gii crea código de trabajo para nosotros. A continuación, personalizaremos el código scaffolding para que esto funcione para nosotros.
3. Personalización de nuestro código
Personalización de la vista de formulario
Vamos a limpiar el formulario. En /hello/views/Status/_form.php, elimine los campos creados y actualizados:
1 |
<?= $form->field($model, 'created_at')->textInput() ?> |
2 |
<?= $form->field($model, 'updated_at')->textInput() ?> |
Reemplace el campo de permisos con el código de lista desplegable que creamos en la segunda parte de esta serie:
1 |
<?=
|
2 |
$form->field($model, 'permissions')->dropDownList($model->getPermissions(), |
3 |
['prompt'=>'- Choose Your Permissions -']) ?> |
Tenemos que volver a poner la función getPermissions en el modelo también. Editar /hello/models/Status.php. Ponga de nuevo las definiciones constantes y las funciones de permisos:
1 |
const PERMISSIONS_PRIVATE = 10; |
2 |
const PERMISSIONS_PUBLIC = 20; |
3 |
...
|
4 |
|
5 |
public function getPermissions() { |
6 |
return array (self::PERMISSIONS_PRIVATE=>'Private',self::PERMISSIONS_PUBLIC=>'Public'); |
7 |
}
|
8 |
|
9 |
public function getPermissionsLabel($permissions) { |
10 |
if ($permissions==self::PERMISSIONS_PUBLIC) { |
11 |
return 'Public'; |
12 |
} else { |
13 |
return 'Private'; |
14 |
}
|
15 |
}
|
Su nuevo formulario Status debería tener este aspecto:



Necesitamos ajustar el controlador un poco para que el formulario se guarde correctamente.
Personalización del controlador
En /hello/controllers/StatusController.php, reemplace el método actionCreate por este código:
1 |
public function actionCreate() |
2 |
{
|
3 |
$model = new Status(); |
4 |
|
5 |
if ($model->load(Yii::$app->request->post())) { |
6 |
$model->created_at = time(); |
7 |
$model->updated_at = time(); |
8 |
if ($model->save()) { |
9 |
return $this->redirect(['view', 'id' => $model->id]); |
10 |
}
|
11 |
}
|
12 |
return $this->render('create', [ |
13 |
'model' => $model, |
14 |
]);
|
15 |
}
|
Cuando
se publica el formulario, establecemos manualmente los campos
created_at y updated_at, luego guardamos los datos en la base de datos.
Cuando guarde su primera actualización de estado, verá la siguiente página de vista:



Ajuste del diseño
Vamos
a reajustar la barra de navegación para que no se desplace hacia abajo
para el estado pero salta directamente a la página de índice de estado. Edite /hello/views/layouts/main.php y reemplace el código de Nav::widget con esto:
1 |
echo Nav::widget([ |
2 |
'options' => ['class' => 'navbar-nav navbar-right'], |
3 |
'items' => [ |
4 |
['label' => 'Home', 'url' => ['/site/index']], |
5 |
['label' => 'Status', 'url' => ['/status/index']], |
6 |
['label' => 'About', 'url' => ['/site/about']], |
7 |
['label' => 'Contact', 'url' => ['/site/contact']], |
8 |
Yii::$app->user->isGuest ? |
9 |
['label' => 'Login', 'url' => ['/site/login']] : |
10 |
['label' => 'Logout (' . Yii::$app->user->identity->username . ')', |
11 |
'url' => ['/site/logout'], |
12 |
'linkOptions' => ['data-method' => 'post']], |
13 |
],
|
14 |
]);
|
La vista de cuadrícula
Cuando regrese a la vista de índice de estado, puede ver la cuadrícula Yii2 llena de datos:



El código que genera esta página está en /hello/views/status/index.php:
1 |
<?php
|
2 |
|
3 |
use yii\helpers\Html; |
4 |
use yii\grid\GridView; |
5 |
|
6 |
/* @var $this yii\web\View */
|
7 |
/* @var $searchModel app\models\StatusSearch */
|
8 |
/* @var $dataProvider yii\data\ActiveDataProvider */
|
9 |
|
10 |
$this->title = 'Statuses'; |
11 |
$this->params['breadcrumbs'][] = $this->title; |
12 |
?>
|
13 |
<div class="status-index"> |
14 |
|
15 |
<h1><?= Html::encode($this->title) ?></h1> |
16 |
<?php // echo $this->render('_search', ['model' => $searchModel]); ?> |
17 |
|
18 |
<p> |
19 |
<?= Html::a('Create Status', ['create'], ['class' => 'btn btn-success']) ?> |
20 |
</p>
|
21 |
|
22 |
<?= GridView::widget([ |
23 |
'dataProvider' => $dataProvider, |
24 |
'filterModel' => $searchModel, |
25 |
'columns' => [ |
26 |
['class' => 'yii\grid\SerialColumn'], |
27 |
|
28 |
'id', |
29 |
'message:ntext', |
30 |
'permissions', |
31 |
'created_at', |
32 |
'updated_at', |
33 |
|
34 |
['class' => 'yii\grid\ActionColumn'], |
35 |
],
|
36 |
]); ?> |
37 |
|
38 |
</div>
|
Si prueba la clasificación de columnas y ve, actualiza y elimina los iconos, verá que Gii ha construido toda la funcionalidad de estas características también.
Así que en tan sólo unos minutos, creamos un esquema para nuestra base de datos y generamos un modelo y todo el código de la aplicación web necesario para una aplicación básica. Espero que hayas encontrado las capacidades de generación de código de Yii tan impresionantes como yo.
¿Que sigue?
A continuación, le mostraré cómo integrar las funciones de registro de usuario y de inicio de sesión en nuestra aplicación para poder establecer relaciones de unión entre puestos de estado y usuarios específicos.
Si quieres saber cuándo llega el próximo tutorial de Yii2, sígueme @reifman en Twitter o revisa mi página Tuts+ instructor. Mi página de instructor incluirá todos los artículos de esta serie tan pronto como se publiquen.



