Crea un proyecto Laravel y configura una base de datos MySQL

4/17

Lectura

Instalación y creación de proyectos con Laravel o Composer ➕

Para crear un proyecto de Laravel primero debemos instalarlo, para esto se pueden tomar dos caminos: el instalador de Laravel y Composer.

...

Regístrate o inicia sesión para leer el resto del contenido.

Aportes 54

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Hola, vengo del curso de Curso de Introducción a Laravel y en el exponen como buenas practicas la implementacion de migrations, factories y models para crear la BD directamente desde laravel, porque acá se realiza manualmente?

Me gusta el proyecto pero estaria más interesante si usáramos **migrates ** de laravel ♥

¿Por qué no utilizar las migraciones y mostrar más bondades de este framework?

Hola! despúes de unos días pude realizar este ejercicio, pero en vez de crear las tablas con sql las hice a partir de las migraciones. les dejo mi aporte de lo que aprendí:
Basicamente cuando hacía con código sql estaba todo bien. Pero en el reto de la clase siguiente tenias que ejecutar php artisan migrate. Qué pasaba? bueno laravel por defecto trae la tabla users (y dos más), cuando ejecutas php artisan migrate me daba el error de la tabla users ya existe. Claro acá ya la habíamos realizado con sql. Así que hay dos opciones: eliminar todos los archivos de la carpeta migrations, o escribir (que sería la manera correcta) las tablas creando los archivos con php artisan make:migrations name_archivo.

Yo hice de la segunda manera, les comparto como quedaron:

2021_01_19_180143_create_projects_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProjectsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->id('project_id');
            $table->unsignedBigInteger('city_id');
            $table->unsignedBigInteger('company_id');
            $table->unsignedBigInteger('user_id');
            $table->string('name');
            $table->date('execution_date')->nulleable();
            $table->tinyInteger('is_active')->nulleable();

            $table->timestamps();
            

            //llaves foraneas
            $table->foreign('city_id')->references('city_id')->on('cities');
            $table->foreign('company_id')->references('company_id')->on('companies');
            $table->foreign('user_id')->references('user_id')->on('users');

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('projects');
    }
}

2021_01_19_172042_create_cities_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCitiesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cities', function (Blueprint $table) {
            $table->id('city_id');
            $table->string('name');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cities');
    }
}

2021_01_19_171850_create_companies_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCompaniesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->id('company_id');
            $table->string('name');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('companies');
    }
}

Espero les sirva el aporte! saludos.

Hola otra vez no me podía quedar con la duda asi que cree las migraciones de la base de datos jejjej
les dejo la rama en github por si quieren crear un fork o algo asi

https://github.com/MiguelAngelMP/Curso-de-Manejo-de-Datos-en-Laravel-con-Eloquen/tree/featureMigratesDB

y ejecutar
no olviden configurar la variables en el archivo .env

php artisan migrate --path=database/migrations/project_manager/

Lo hice todo con migraciones, factories y un seeder.

Esto se ve en el curso de introducción a Laravel de @italo

En mi caso prefiero PostgreSQL el DML queda asi:

CREATE TABLE projects (
project_id serial,
city_id INT NULL,
company_id INT NULL,
user_id INT NULL,
name VARCHAR(30) NULL,
execution_date DATE NULL,
is_active INT NULL,
created_at DATE NULL,
updated_at DATE NULL,
PRIMARY KEY (project_id));

CREATE TABLE users (
user_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (user_id));

CREATE TABLE companies (
company_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (company_id));

CREATE TABLE cities (
city_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (city_id));

ALTER TABLE projects ADD CONSTRAINT fk_city_id FOREIGN KEY (city_id) REFERENCES cities(city_id);

ALTER TABLE projects ADD CONSTRAINT fk_company_id FOREIGN KEY (company_id) REFERENCES companies(company_id);

ALTER TABLE projects ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(user_id);

Y en el archivo .env solo es necesario cambiar esta linea DB_CONNECTION=mysql por esta DB_CONNECTION=pgsql

Todo listo, base de datos conectada.

Excelente, hubiese preferido que esta clase fuera en video, se hubiese aprovechado a explicar el tema de migraciones de Laravel que es un sistema mucho mejor para poder crear la base de datos y demás, pero con esto está perfecto.

Y Tinker es una maravilla ❤️ Puedes ejecutar PHP ahí para hacer pruebas y demás:3

Si usas MacOs e instalaste XAMPP como yo, para utilizar la consola de MySQL o MariaDB tuve que moverme al directorio /Applications/XAMPP/bin y ahí ejecutar ./mysql -u <usuario> -p

O directamente, con mi usuario root:

/Applications/XAMPP/bin/./mysql -u root -p

proporcionas la contraseña que definiste para tu usuario al instalar XAMPP o MySQL y una vez dentro, con show databases

MariaDB [(none)]> show databases

verás una lista de las bases de datos y podras empezar a crear tu nueva base de datos

Es la primera vez que veo en algún tema relacionado con Laravel y BD que no se crean las tablas a partir de migraciones. Me gusta porque vamos a poder ver como conectarnos y trabajar con una BD ya creada

para instalar composer deben ir a https://getcomposer.org/download/

tuve que agregar laravel a las variables de entorno para poder crear el proyecto

Seguí el paso a paso y me funciono al primer intento. Estoy usando Windows 10.

Lo hice completamente con migraciones y la verdad es que siento que es mucho más rápido. Cuando tienes errores por ejemplo en una llave foránea te da la indicación del error.
Les comparto mis migraciones
.
Crear migración:

php artisan make:migration create_tableName_table

Es importante primero crear la migración de users, cities y companies para que al hacer las llaves foráneas en la tabla projects, estas se hagan de forma correctamente con las tablas mencionadas ya creadas previamente.
.
Y las migraciones quedaron así:
.
2022_08_27_191242_create_cities_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCitiesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cities', function (Blueprint $table) {
            $table->bigIncrements('city_id');
            $table->string('name', 50);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('cities');
    }
}

.
2022_08_27_191340_create_companies_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCompaniesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->bigIncrements('company_id');
            $table->string('name', 50);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('companies');
    }
}

.
2022_08_27_191503_create_users_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('user_id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

.
2022_08_27_191645_create_projects_table

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProjectsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('projects', function (Blueprint $table) {
            $table->bigIncrements('project_id');
            $table->integer('budget');
            $table->string('name');
            $table->date('execution_date');
            $table->boolean('is_active');

            $table->bigInteger('city_id')->unsigned()->nullable();
            $table->bigInteger('company_id')->unsigned()->nullable();
            $table->bigInteger('user_id')->unsigned()->nullable();
            
            $table->foreign('city_id')->references('city_id')->on('cities')->onDelete('set null');
            $table->foreign('company_id')->references('company_id')->on('companies')->onDelete('set null');
            $table->foreign('user_id')->references('user_id')->on('users')->onDelete('set null');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('projects');
    }
}

.

Lo siguiente que hice fue crear mi BD y en el archivo .env colocar el nombre de dicha BD

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_manager
DB_USERNAME=root
DB_PASSWORD=

.
Finalmente solo fue cuestion de ejecutar las migraciones

php artisan migrate

MySQL Workbench actualmente sigue siendo gratuito?

Lo más común en el desarrollo de proyectos es que la base de datos la vas administrar por separado, es decir no desde Laravel creo que el ejemplo aplica excelentemente, muchas de las empresas se cuidan en esta parte, es decir, que al programador no le corresponde gestionar la BD desde el framework, tienen su ingeniero experto en este tema.

Si te aparece un mensaje de error

Psy Shell v0.10.4 (PHP 7.3.11 — cli) by Justin Hileman
>>> DB::connection()->getPdo();

PDOException with message 'SQLSTATE[HY000] [2002] Connection refused'

al intentar ejecutar tinker y ya revisaste que tu archivo .env es correcto y con los mismos datos te puedes conectar via consola, intenta ejecutar lo siguiente en consola de MySQL (o MariaDB):

MariaDB [(none)]> show variables like '%sock%';

Te saldrá algo así:


Variable_name Value
performance_schema_max_socket_classes 10
performance_schema_max_socket_instances -1
socket /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

Copia el último valor y lo vas a agregar a tu archivo .env con la variable DB_SOCKET así:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_manager
DB_USERNAME=user
DB_PASSWORD=pwd
DB_SOCKET='/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock'

Y listo! podrás ejecutar tinker sin error

php artisan tinker

Psy Shell v0.10.4 (PHP 7.3.11 — cli) by Justin Hileman
>>> DB::connection()->getPdo();
=> PDO {#3270
     inTransaction: false,
     attributes: {
       CASE: NATURAL,

Después de varios intentos lo logré, realice el proceso haciendo migraciones con artisan, para ello hay que tener mucho en cuenta lo que se llama: integridad referencial en laravel con las claves foráneas, les dejo el link que me sirvió mucho: https://styde.net/claves-foraneas-e-integridad-referencial-de-datos-en-laravel/

perfecto!!!

Listo 😃

![](

Los que quieran probrar tinker en la web, pueden darle un vistazo a https://tinkerwell.app/

Creación de tablas usando migraciones

  1. Después de crear y probar la conexión con la base de datos podemos empezar a crear las tablas usando migraciones. Abriendo la consola y ejecutando el comando php artisan migrate.
  1. Con eso se crearan tres tablas users, migrations y failed_jobs.
    3.En el proyecto nos dirigimos a ** database/migration** y podremos ver las migraciones que se ejecutaron previamente.

** Nota: Las migraciones no son más que clases de php que heredan de otra clases propia del framework
llamada migration.**
Comando de migraciones:

  • . php artisan migrate:refresh: Se utiliza para modificar un campo existente en una migración y evitar el incremento exponencial de migraciones por cambios sencillos. El comando refresh funciona de la siguinete forma, ejecuta primero un reset de todas las migraciones y las reconstruirlas actualizando el dato.

  • . php artisan migrate:reset: Hace un retroceso de las migraciones ejecutadas previamente, eliminando las tablas creadas, una vez ejecutado este comando usamos php artisan migrate para reconstruir tablas.

  • .php artisan migrate:rollback: Regresa el ultimo lote de migraciones ejecutados.

  • .php artisan make:migration: Crea una nueva migración y actualiza la bd.

  • .php artisan migrate: Vuelve a construir las tablas.

  1. Abre la migración de create_user_table.php y deja los datos necesarios como lo pide el ejemplo.

5.Aplicamos el comando php artisan make:refresh para actualizar la migración. (Puedes crear tu propia migración si así lo desea, en mi caso lo hice actualizando para fines practicos)

  1. Resultado

Pasos para crear tablas de companies y cities
Nota: Es bueno que el nombre de nuestra migración hara referencia a lo que vamos a hacer.
Nota: formato para crear tablas desde una migración y te genere la estructura básica de los campos que necesita una tabla respetando el formato de Laravel.

  1. Crea una nueva migración desde consola
  1. Creamos nuestro esquema de tabla que vamos a utilizar.
    ** Nota: ** Si el formato de tu migración sigue el formato de create_nombretablaenpluralingles_table
    Laravel generá la estructura básica del schema para tu tabla.
  1. Ejecuta la migración utilizando php artisan migrate y asi poder crear en tu base de datos la nueva tabla con los campos indicados.

4.Con estos pasos podemos seguir creando nuestras tablas.

Para el caso de projects que utiliza claves foraneas es lo mismo procedimiento variando en la creación de claves foraneas como te lo muestro a continuación.

Recomendación: Sigue intentando hasta conseguir los resultado que deseas y busca el porque de cada cosas que usas. Eso me llevo a escribir este pequeño ejemplo de mis proceso. Estos links son de mucha ayuda.Saludos y éxito en este curso.

Link:
Link:

No entiendo la idea de no utilizar migraciones si se supone que estamos creando un proyecto de Laravel

Si estas en entorno linux (Ubuntu)
primero debe instalar** el servidor de mysql**

sudo apt-get install mysql-server

iniciamos el servidor

sudo service mysql start

luego usamos el comando

mysql -h localhost -u root -p

Al momento de poner la contraseña , se coloca enter ya que no se tiene y listo.

=D

aqui ya vamos mal porque un curso que nos da las buenas practicas del ORM no se va por Eloquent como decia un comentario el curso por ahora ha sido lectura is mell

Les dejo las migraciones, por si lo quieren hacer de esta forma.

users

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

companies

Schema::create('companies', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });

cities

Schema::create('cities', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });

projects

Schema::create('projects', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('city_id');
            $table->unsignedBigInteger('company_id');
            $table->unsignedBigInteger('user_id');
            $table->string('name');
            $table->date('execution_date');
            $table->boolean('is_active')->default(1);
            $table->timestamps();

            $table->foreign('city_id')->references('id')->on('cities');
            $table->foreign('company_id')->references('id')->on('companies');
            $table->foreign('user_id')->references('id')->on('users');
        });

Les comparto mi repositorio, estaré trabajando con laravel 8 y para esta clase, use las migraciones para crear la base de datos.

https://github.com/FranciscoJCC/project_manager

Para los que dicen “porque no uso migrations”, al menos en mi experiencia trabajando con Laravel en proyectos mas grandes, las migraciones se hacian demasiado complejas cuando hacía cambios o actualizaciones. Y con el paso del tiempo decidí dejar de usarlo al menos en proyectos que ya estaban funcionando. Bueno es mi opinión 😊

Para los que deseen tener las migraciones podrían generarlas usando :

https://github.com/kitloong/laravel-migrations-generator

Existe una herramiento bastante buena que es blueprint esta gran herramienta nos ahorra un poco de tiempo a la hora de crear migraciones, modelos y controladores, espero que le guste.

Realizando las migraciones creo que seria asi:

Creamos las factories con php artisan, Los modificadores -mfc significan que crearemos los Models, Factories y Controllers

php artisan make:model Projects -mfc
php artisan make:model Companies -mfc 
php artisan make:model Cities -mfc

Luego procedemos a modificar cada una de las factories en database/migrations:

//Migraciones para usuarios

            $table->bigIncrements('user_id');
            $table->string('name')->nullable();
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();

//Migraciones para projects

            $table->unsignedBigInteger('city_id')->nullable(); //Relacion con las ciudades
            $table->unsignedBigInteger('company_id')->nullable(); // Relacion con la compañia
            $table->unsignedBigInteger('user_id')->nullable(); // Relacion con el usuairo

            //Atributos
            $table->string('name', 30);
            $table->date('execution_date');
            $table->tinyInteger('is_active');
            $table->dateTime('created_at');
            $table->dateTime('updated_at');  

//Migraciones para companies

            $table->bigIncrements('company_id');
            $table->string('name', 20);

            $table->timestamps();

//cities

            $table->bigIncrements('city_id');
            $table->string('name', 30)->nullable();
            $table->timestamps();

Luego creamos la migracion para añadir las llaves foraneas en la tabla projects asi

php artisan make:migration add_foreign_key_projects_table --table=projects

y finalmente agregamos las llaves foraneas en la migracion:

            $table->foreign('city_id')->references('city_id')->on('cities');
            $table->foreign('company_id')->references('company_id')->on('companies');
            $table->foreign('user_id')->references('user_id')->on('users');

y por ultimo el comando

php artisan:migrate

Configuración inicial, lista!
Genial ver como se inicia el proyecto cuando la base de datos ya existe.

PROBLEMA CON LA MIGRACION
Cuando crees tus migracion, en la de projects tendras que agregar las FK. Entonces primero tendras que crear la migracion de todas las tablas y colocas en consola

php artisan migrate

pero aun te faltan las FK, entonces las creas y el error que te genera de que hay errores con las FK se debe a que intenta crear las FK antes de que existan esas tablas, entonces habra errores como que hay error en su estructura, pero bueno para solucionarlo solo tienes que migrar unicamente la de projects o como sea el nombre que hayas usado. Para solo migrar una tabla, puedes usar

php artisan migrate:refresh --path=database/migrations/2021_09_01_010730_create_projects_table.php

Tiene que ser un migrate:refresh porque si pones solo migrate dira que no hay nada que migrar.

Para recapitular

  1. Creas tus migraciones de: users, projects, cities, companies
  2. En consola: “php artisan migrate” para migrar las tablas a la database
  3. Creas las FK en la tabla de projects
  4. Refrescas la migracion, pero solo de la tabla projects para que cree las FK y eso es con:
    php artisan migrate:refresh --path=database/migrations/2021_09_01_010730_create_projects_table.php

Espero no tengas este problema, pero a mi me tomo al menos una horita antes de encontrar la solucion… quiza es obvio, pero habemos quienes no lo cachamos rapido 😃

Por la version de PHP (7.1.33) que utiliza la profesora yo diria que el proyecto se hizo en Laravel 5.8

No tengo pruebas, pero tampoco dudas. #SinMiedoAlExito

SI desean tambien pueden usar docker, es bastande comodo en especial en unix
https://laravel.com/docs/8.x/installation#choosing-your-sail-services

Excelente, muy bien explicado y directo al grano.

me sale el siguiente error, ayuda!!!

Para poder ejectuar php artisan tinker (me marcaba error), tuve que agregar el directorio $HOME/.composer/vendor/bin a mi PATH en MacOS.
Puedes ver el contenido actual de tu PATH con la siguiente instrucción desde consola:

echo $PATH

Pero como uso oh-my-zsh, edité el archivo .zshrc en mi directorio HOME y agregué las siguientes líneas:

export PATH="$PATH:$HOME/.composer/vendor/bin"

# Original PATH:
# <Aquí guardé mi PATH original como respaldo>

De hecho, esto se menciona en la documentación oficial de Laravel:



Para los que usan MySQL Workbench para crear la base de datos. Hay una manera de crear las migraciones directamente desde el programa. Acá les dejo una guía:

https://laravel-news.com/export-from-mysql-workbench-to-a-laravel-migration

No estoy de seguro de como hacerlo me podrian decir como instalarlo en linux. los comandos que estan al principio no me funcionaron

¿Que seria mas potente para un manejador de proyectos al que se le haran cambios mas adelante en la base de datos o como estan acomodados los datos? Crear la DB mediante querys como esta vez o estar realizando la migracion? o se pueden realizar las dos?

Gracias por la explicacion tan clara.

Conexión a la base de datos configurada en el archivo .env revision de la conexión usando tinker.
**Tinker: ** Es una consola de comandos única de Laravel donde podremos hacer pruebas funcionamiento sin tener que ejecutar toda la aplicación e interactuar con los métodos y clases de nuestro proyecto.

Dejo repositorio con proyecto en Laravel 9, se han creado las migraciones, modelos (los modelos están en blanco)

https://github.com/TheDiego350z1/project-manager

Instrucciones:

  • Clonar repositorio
  • Ejecutar:
composer install
  • Crear base de datos (puede ser el nombre que quieran)
  • Colocar en el archivo .env el nombre de la base de datos
DB_DATABASE=your_data_base
  • Ejecutar
php artisan migrate
  • Seguir el curso con normalidad

Podemos Abreviar el código de creación de foreing keys de la siguiente forma

public function up()
{
   Schema::create('projects', function (Blueprint $table) {
	$table->id();
	$table->foreignId('city_id')->constrained('cities');
	$table->foreignId('company_id')->constrained('companies');
	$table->foreignId('user_id')->constrained('users');
	$table->string('name');
	$table->date('execution_date');
	$table->tinyInteger('is_active');
        $table->timestamps();
  });
}

El foreignId método es un alias para unsignedBigInteger mientras que el constrained método utilizará convenciones para determinar la tabla y el nombre de la columna a la que se hace referencia.
Fuente: documentación laravel

Si van a utilizar MySQL, aquí dejo el dump:

CREATE DATABASE IF NOT EXISTS project_manager;
use project_manager;

SET foreign_key_checks = 0;
DROP TABLE IF EXISTS users;
CREATE TABLE users (
  user_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20) NULL,
  created_at DATETIME,
  updated_at DATETIME,
  PRIMARY KEY (user_id)
);

DROP TABLE IF EXISTS companies;
CREATE TABLE companies (
  company_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20) NULL,
  created_at DATETIME,
  updated_at DATETIME,
  PRIMARY KEY (company_id)
);

DROP TABLE IF EXISTS cities;
CREATE TABLE cities (
  city_id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20) NULL,
  created_at DATETIME,
  updated_at DATETIME,
  PRIMARY KEY (city_id)
);

DROP TABLE IF EXISTS projects;
CREATE TABLE projects (
  project_id INT NOT NULL AUTO_INCREMENT,
  city_id INT NULL,
  company_id INT NULL,
  user_id INT NULL,
  name VARCHAR(30) NULL,
  execution_date DATE NULL,
  is_active TINYINT NULL,
  created_at DATETIME NULL,
  updated_at DATETIME NULL,
  PRIMARY KEY (project_id)
);
ALTER TABLE projects ADD FOREIGN KEY (city_id) REFERENCES cities(city_id);
ALTER TABLE projects ADD FOREIGN KEY (company_id) REFERENCES companies(company_id);
ALTER TABLE projects ADD FOREIGN KEY (user_id) REFERENCES users(user_id);
SET foreign_key_checks = 1;

¡Vamos bien!

Muy buen tutorial.

Muy buen tutorial.

Vengo del curso de PHP con laravel, me esta gustando mucho este framework.

Si utilizaste

composer global require laravel/installer

para instalar composer, puede ser que debas reiniciar tu terminal para ejecutar la siguiente instrucción