aplicación yii2 completa ejemplo de referencia puede que contenga algún error

PHOTO EMBED

Mon May 29 2023 16:06:21 GMT+0000 (Coordinated Universal Time)

Saved by @jrg_300i #php #poo #mvc #jquery #postgresql

Supongamos que estamos desarrollando una aplicación de gestión de proyectos. Cada proyecto tiene un solo gerente, pero un gerente puede estar a cargo de varios proyectos. Además, cada proyecto puede tener varios miembros del equipo, y cada miembro del equipo puede estar asignado a varios proyectos.

1.-modelo(app/models/Proyecto.php)

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Proyecto extends ActiveRecord
{
    public static function tableName()
    {
        return 'proyectos';
    }

    public function getGerente()
    {
        return $this->hasOne(Gerente::className(), ['id' => 'id_gerente']);
    }

    public function getMiembrosEquipo()
    {
        return $this->hasMany(MiembroEquipo::className(), ['id_proyecto' => 'id']);
    }
}

En este ejemplo, estamos creando un modelo llamado Proyecto que extiende de la clase ActiveRecord de Yii2. Este modelo representa la tabla proyectos de la base de datos PostgreSQL y tiene una relación de uno a uno con la tabla gerentes y una relación de uno a muchos con la tabla miembros_equipo.

2.-Modelo(app/models/Gerente.php)

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Gerente extends ActiveRecord
{
    public static function tableName()
    {
        return 'gerentes';
    }

    public function getProyectos()
    {
        return $this->hasMany(Proyecto::className(), ['id_gerente' => 'id']);
    }
}

En este ejemplo, estamos creando un modelo llamado Gerente que extiende de la clase ActiveRecord de Yii2. Este modelo representa la tabla gerentes de la base de datos PostgreSQL y tiene una relación de uno a muchos con la tabla proyectos.


3.-Modelo(app/models/MiembroEquipo.php)

<?php

namespace app\models;

use yii\db\ActiveRecord;

class MiembroEquipo extends ActiveRecord
{
    public static function tableName()
    {
        return 'miembros_equipo';
    }

    public function getProyecto()
    {
        return $this->hasOne(Proyecto::className(), ['id' => 'id_proyecto']);
    }

    public function getEmpleado()
    {
        return $this->hasOne(Empleado::className(), ['id' => 'id_empleado']);
    }
}

En este ejemplo, estamos creando un modelo llamado MiembroEquipo que extiende de la clase ActiveRecord de Yii2. Este modelo representa la tabla miembros_equipo de la base de datos PostgreSQL y tiene una relación de uno a uno con la tabla proyectos y una relación de uno a uno con la tabla empleados.


4.-Modelo(app/models/Empleado.php)

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Empleado extends ActiveRecord
{
    public static function tableName()
    {
        return 'empleados';
    }

    public function getMiembrosEquipo()
    {
        return $this->hasMany(MiembroEquipo::className(), ['id_empleado' => 'id']);
    }
}

En este ejemplo, estamos creando un modelo llamado Empleado que extiende de la clase ActiveRecord de Yii2. Este modelo representa la tabla empleados de la base de datos PostgreSQL y tiene una relación de uno a muchos con la tabla miembros_equipo.

5.-Controlador(app/controllers/ProyectoController.php)

<?php

namespace app\controllers;

use yii\web\Controller;
use app\models\Proyecto;

class ProyectoController extends Controller
{
    public function actionIndex()
    {
        $proyectos = Proyecto::find()->with('gerente', 'miembrosEquipo.empleado')->all();
        return $this->render('index', ['proyectos' => $proyectos]);
 }
}

En este ejemplo, estamos creando un controlador llamado ProyectoController que tiene un método llamado actionIndex que se encarga de obtener todos los proyectos de la base de datos y sus relaciones con gerentes y miembros del equipo utilizando los modelos Proyecto, Gerente, MiembroEquipo y Empleado. Luego, se renderiza la vista index y se le pasa como parámetro los proyectos obtenidos.

6.-Vista(app/views/proyecto/index.php)

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Nombre</th>
            <th>Gerente</th>
            <th>Miembros del equipo</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($proyectos as $proyecto): ?>
            <tr>
                <td><?= $proyecto->id ?></td>
                <td><?= $proyecto->nombre ?></td>
                <td><?= $proyecto->gerente->nombre ?></td>
                <td>
                    <ul>
                        <?php foreach ($proyecto->miembrosEquipo as $miembroEquipo): ?>
                            <li><?= $miembroEquipo->empleado->nombre ?></li>
                        <?php endforeach ?>
                    </ul>
                </td>
            </tr>
        <?php endforeach ?>
    </tbody>
</table>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
    $(document).ready(function() {
        // Código de jQuery aquí
    });
</script>

En este ejemplo, estamos creando una vista llamada index que muestra una tabla con los proyectos, sus gerentes y sus miembros del equipo. También estamos incluyendo la librería de jQuery y un bloque de código jQuery vacío que se ejecutará cuando el DOM esté listo.

7.-Codigo Jquery (app/web/js/mi-script.js)

En este ejemplo, estamos utilizando jQuery para hacer una petición AJAX al servidor cuando el usuario hace clic en una fila de la tabla de proyectos. La petición se realiza al controlador ProyectoController y al método actionGet, que se encarga de obtener los detalles del proyecto con el ID especificado y devolverlos en formato JSON.
Recuerda que debes ajustar los nombres de los archivos y las rutas según la estructura de tu aplicación Yii2 y PostgreSQL.
Espero que esto te ayude a entender cómo podrías implementar relaciones de 1 a 1, 0 a 1 y muchos a muchos utilizando Yii2, PostgreSQL, MVC, OOP y jQuery.

8.- código SQL para crear las tablas utilizadas en el ejemplo de la aplicación web que utiliza Yii2, PostgreSQL, MVC, OOP y jQuery para implementar relaciones de 1 a 1, 0 a 1 y muchos a muchos:

Tabla proyectos ()
CREATE TABLE proyectos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(255) NOT NULL,
    id_gerente INTEGER REFERENCES gerentes(id)
);

En esta tabla, estamos creando un campo id que es una clave primaria autoincremental, un campo nombre que almacena el nombre del proyecto y un campo id_gerente que es una clave foránea que hace referencia al campo id de la tabla gerentes.

9.-tabla gerentes

CREATE TABLE gerentes (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(255) NOT NULL
);

En esta tabla, estamos creando un campo id que es una clave primaria autoincremental y un campo nombre que almacena el nombre del gerente.

10.- tabla miembros_equipo

CREATE TABLE miembros_equipo (
    id_proyecto INTEGER REFERENCES proyectos(id),
    id_empleado INTEGER REFERENCES empleados(id),
    PRIMARY KEY (id_proyecto, id_empleado)
);

En esta tabla, estamos creando dos campos id_proyecto e id_empleado que son claves foráneas que hacen referencia a los campos id de las tablas proyectos y empleados, respectivamente. Además, estamos creando una clave primaria compuesta por ambos campos para asegurarnos de que no haya duplicados.

11.-tabla empleados

CREATE TABLE empleados (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(255) NOT NULL
);

En esta tabla, estamos creando un campo id que es una clave primaria autoincremental y un campo nombre que almacena el nombre del empleado.

Recuerda que debes ajustar los nombres de las tablas y los campos según la estructura de tu aplicación. Además, debes asegurarte de que las claves foráneas estén correctamente definidas y que las relaciones entre las tablas sean coherentes.

posibles consultas que podrías hacer utilizando el código SQL de la aplicación web que utiliza Yii2, PostgreSQL, MVC, OOP y jQuery para implementar relaciones de 1 a1, 0 a 1 y muchos a muchos:

1.-Obtener todos los proyectos con sus gerentes y miembros del equipo:

SELECT p.nombre AS proyecto, g.nombre AS gerente, e.nombre AS empleado
FROM proyectos p
LEFT JOIN gerentes g ON p.id_gerente = g.id
LEFT JOIN miembros_equipo me ON p.id = me.id_proyecto
LEFT JOIN empleados e ON me.id_empleado = e.id;

En esta consulta, estamos obteniendo todos los proyectos con sus gerentes y miembros del equipo utilizando las tablas proyectos, gerentes, miembros_equipo y empleados. Estamos utilizando un LEFT JOIN para asegurarnos de que se incluyan todos los proyectos, incluso aquellos que no tienen gerente o miembros del equipo.


2.-Obtener todos los proyectos que tienen un gerente asignado:

SELECT p.nombre AS proyecto, g.nombre AS gerente
FROM proyectos p
INNER JOIN gerentes g ON p.id_gerente = g.id;

En esta consulta, estamos obteniendo todos los proyectos que tienen un gerente asignado utilizando las tablas proyectos y gerentes. Estamos utilizando un INNER JOIN para asegurarnos de que solo se incluyan los proyectos que tienen un gerente asignado.

3.-Obtener todos los proyectos en los que trabaja un empleado específico:

SELECT p.nombre AS proyecto, e.nombre AS empleado
FROM proyectos p
INNER JOIN miembros_equipo me ON p.id = me.id_proyecto
INNER JOIN empleados e ON me.id_empleado = e.id
WHERE e.nombre = 'Juan';

En esta consulta, estamos obteniendo todos los proyectos en los que trabaja un empleado específico utilizando las tablas proyectos, miembros_equipo y empleados. Estamos utilizando un INNER JOIN para asegurarnos de que solo se incluyan los proyectos en los que trabaja el empleado específico y estamos utilizando una cláusula WHERE para filtrar por el nombre del empleado.

4.-Obtener todos los empleados que trabajan en un proyecto específico:

SELECT e.nombre AS empleado
FROM empleados e
INNER JOIN miembros_equipo me ON e.id = me.id_empleado
INNER JOIN proyectos p ON me.id_proyecto = p.id
WHERE p.nombre = 'Proyecto A';

En esta consulta, estamos obteniendo todos los empleados que trabajan en un proyecto específico utilizando las tablas empleados, miembros_equipo y proyectos. Estamos utilizando un INNER JOIN para asegurarnos de que solo se incluyan los empleados que trabajan en el proyecto específico y estamos utilizando una cláusula WHERE para filtrar por el nombre del proyecto.
Recuerda que debes ajustar las consultas según la estructura de tu aplicación y las relaciones entre las tablas.

content_copyCOPY

este es una ejemplo hecho es yii2 es referencial puede contener errores el ejemplo no lo he probado