You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
3 Hrs
21 Min
57 Seg
Curso de Introducción a Laravel 6

Curso de Introducción a Laravel 6

Profesor Italo Morales F

Profesor Italo Morales F

Eloquent: trabajando con este ORM

13/37
Resources

How to get started with Laravel Eloquent to manage databases?

Laravel Eloquent is a formidable tool within the Laravel framework that facilitates database manipulation and querying. Its main purpose is to allow us to easily operate on stored data, either for inserts, updates or queries. In this section we will see how to get started with Eloquent and perform the basic configurations.

Setting up a new project in Laravel

  1. Creating the project: To work with Eloquent, we first need to create a new project in Laravel. This is done by running the laravel new command followed by the project name in the terminal of the sites folder.
  2. Using the code editor: Once created, we open the new project in our code editor to start configuring all the necessary practices.

Generating models and database configurations

What is a model in Laravel?

A model in Laravel is the representation of a table in our database. Thanks to the migration and default configuration, Laravel allows you to easily create these models.

  • Command to create models: We use php artisan make:model ModelName.
  • Additional parameters: With parameters like -m (migration), -f (factory) and -s (seeder), we can generate the basic structures needed to manipulate the data.

Connecting to the database

To perform any operation, it is vital to connect Laravel with our database:

  • .env file: we modify the .env file to configure access to the database, specifying name, user and password.

Designing tables and applying migrations

The structure of the tables is defined with migrations. Once modified, with php artisan migrate we can create the tables in the database.

public function up(){ Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->timestamps(); }); });}

How to insert data and practice with Eloquent?

Eloquent provides us with multiple ways to insert and practice with data.

Data insertion using Factory and Tinker

  • Factory: Makes it easy to create random data for testing.
  • Tinker: By running php artisan tinker we can use Factory to populate our database:
factory(AppPost::class, 30)->create();

This will quickly generate 30 records in the posts table for practice.

How to query and display data?

Eloquent provides us with simple methods to access and manipulate our records.

Basic queries with Eloquent

To get data from a table, just use the all() method:

$posts =  AppPost::all();

We can easily display these records in a Blade view.

Advanced searching and filtering

Eloquent allows more specific searches using methods like where:

$posts =  App\Post::where('id', '>=', 20)->get();

We can also sort results with orderBy:

$posts =  App\Post::orderBy('id', 'desc')->get();

Additional practices using advanced methods

Limiting results and selecting specific records

It is common to want to limit the number of records retrieved from a query; to do this, we use the take method:

$posts =  AppPost::take(3)->get();

Best practices with Eloquent

It is crucial to remember that each model file represents a table and to understand the importance of manipulating data correctly for any application. Eloquent provides us with an intuitive interface that streamlines these tasks, allowing us to manage large volumes of data efficiently. With practice and continued use, it can become a powerful tool for any developer in the Laravel ecosystem. So, keep learning and practicing to improve your Eloquent skills in Laravel!

Contributions 48

Questions 5

Sort by:

Want to see more contributions, questions and answers from the community?

<h1>Factory()->create ya no funciona!</h1>

Desde laravel 8.0 fue actualizado Factory para que funcione como clase, ahora para llamar el factory desde Tinker es necesario llamarlo del siguiente modo:

Post::factory()->count(10)->create()

Ahora cuando se genera un Modelo con make:model creara la siguiente estructura por default:

El archivo Factory

<?php

namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            // AQUI SE AGREGARA LA CLAVE MAS VALOR DE LA SIGUIENTE FORMA:
						'title' => $this->faker->sentence
        ];
    }
}

El archivo modelo:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}

Eloquent: trabajando con este ORM


Con Eloquent trabajamos el manejo de datos, este está incluido en Laravel y nos ayuda a trabajar con todo lo que tenga que ver con DB.

Esta herramienta nos permitirá hacer consultas, eliminar, actualizar, y listar. Podremos hacer todo lo que se puede hacer con una DB sin escribir una sola línea d SQL.

El comando de php artisan para crear nuevos modelos es:

php artisan make:model *nombre*

// Ej. Solo crea la migración y el factory. Si queremos que cree todo solo escribimos el parámetro -a
php artisan make:model Post -m -f

📋 Un modelo es la representación de una tabla que tenemos en la DB.

Para crear una atributo/dato dentro de la tabla que acabamos de crear, vamos a database → migrations → archivo_con_nombre_de_la_tabla.php y dentro de la clase CreateNombreTable en el método Up() dentro del Shema::create escribiremos el atributo mas el tipo de dato, así:

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

            # Así creamos los atributos, indicando su tipo de dato y el nombre de este.
            $table->string('title');

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

Para modificar el Factory en Laravel 8x tenemos que escribir en el método definition() dentro de las llaves del return.

public function definition()
    {
        return [
            'title' => $this->faker->sentence
        ];
    }

En Laravel 8x el componente Faker ya no se como clase, ahora el componente está implícito en la clase del factory, y por eso tenemos que usar $this para usar faker.

Y para correr el comando dentro de php artisan tinker para crear datos en la DB utilizamos el siguiente comando:

App\Models\Post::factory(30)->create()

El 30 es el número de elementos que queremos que cree.

De la siguiente forma configuramos la ruta para que nos imprima los datos:

use App\Models\Post;
Route::get('eloquent', function () {
    $posts = Post::all();

    foreach ($posts as $post) {
        echo "<p>ID: $post->id, TITLE: $post->title</p> <br>";
    }
});

Si queremos hacer una consulta más compleja, lo hacemos de la siguiente forma:

Route::get('eloquent', function () {
    $posts = Post::where('id', '>=', '20')
        ->get();

    foreach ($posts as $post) {
        echo "<p>ID: $post->id, TITLE: $post->title</p> <br>";
    }
});

// Si queremos ordenar de forma descendente y solo ver 3 items
Route::get('eloquent', function () {
    $posts = Post::where('id', '>=', '20')
        ->orderBy('id', 'desc')
        ->take(3)
        ->get();

    foreach ($posts as $post) {
        echo "<p>ID: $post->id, TITLE: $post->title</p> <br>";
    }
});

Es importante entender que:

  • Un archivo = Una tabla en la base de datos
  • La correcta manipulación de los datos.

UPDATE Laravel 8

En Laravel 8 el tema de los factories también cambiaron, el comando para crear el factory aún funciona, sin embargo, al entrar a PostFactory.php notarás que la estructura es muy diferente.

No te preocupes, para escribir tu factory ahora tienes que buscar la función que se llama “definition()” verás que esta está retornando un array vacío, es ahí en donde tienes que escribir tu factory con los datos que tienes que retornar.

Para acceder al componente “faker” ya no se usa la clase Faker, ahora este componente está implícito en la clase del factory, por lo que simplemente tienes que usar $this para usar faker:

"title" => $this->faker->sentence

Y por último, para correr tu factory, ya no se usa el helper facotry() (Fue descontinuado), ahora debes usar el modelo directamente, por eso, Laravel 8, al crear tu modelo, usa un trait llamado “HasFactory”

Entonces, en tinker debes correr el siguiente comando:

App\Models\Post::factory(30)->create()

El número 30 es la cantidad de registros que deseas crear

Para aclaración a nuevos usuarios en el minuto 3:50, no es crear una nueva tabla como se comenta, sino un nuevo campo de tipo string llamado title.

Compañeros les comparto en enlace del paquete Faker para que vean todos los tipos de datos que pueden generar, también pueden cambiar el idioma de los datos que se generan por si les gusta personalizar esto.

Tambien importante tomar en cuenta que ya en la version 8.0 hay una carpeta para los modelos en App\Models

Hola!! Si quieren formar parte de un grupo de estudios de Devs, les dejo un link a un grupo de Telegram que está muy chulo.

https://t.me/HackTzi

También tienen una organización de GitHub, únete por aquí:

https://github.com/HackTzi

Eloquent: trabajando con este ORM

Modelo: Representación de una tabla que tenemos en nuestra base de datos.

Laravel traer por defecto la representación de la tabla usuarios.

¿Cómo crear un modelo?

Php artisan make: model nombreModelo

¿Cómo mostrar los comandos adicionales que podemos agregar a la creación de un modelo?

Php artisan make:model -h 

¿Cómo correr una migración en Laravel?

Php artisan migrate

Configuración de la base de datos

  1. Ir al archivo .env

  2. Configurar las credenciales de nuestra db

DB_CONNECTION=mysql
	DB_HOST=127.0.0.1
	DB_PORT=3306
	DB_DATABASE=eloquent
	DB_USERNAME=root
	DB_PASSWORD=
  1. Entramos a la consola de tinker para poder revisar si quedo configurada correctamente la db usando el comando php artisan thinker

  2. Revisamos la conexión entre Laravel y nuestra db en mysql usando el comando

DB::connection()->getPdo(); 

En caso de estar bien la conexión nos devolverá información referente a la misma y de lo contrario un error, que con una poco de búsqueda podremos solucionar.

Nota: Por convención los nombres de los modelos deben ser escritos en singular y en inglés, para poder formar así sus migraciones, factory etc…

Seteo de la migración de post

¿Cómo puedo agregar una nueva columna a una migración?

$table->string('nombrecolumna',longitud);

Ejemplo titulo de post

$table->string('title');

Si no especificamos la longitud de la columna a utilizar se pondrá por defecto de 255.

¿Cómo configurar un factory en Laravel para poder crear datos de prueba?

  1. Entro a tinker -> php artisan thinker

  2. Utilizo factory(App\Post::class,30)->create() para poder crear datos de prueba

1 creamos el model . la migracion y la factory
php artisan make:model Post -m -f


2 conexion a abase de datos
-creamos una base de datos en mysql o tu DB
-vamos a la carpeta database/migrations al arcivo cre creamos con el commando en el punto 1
y configuramos la columna title
-agregamos el nombre de nuestra DB en el archivo .env

3 TERMINAL php artisan migrate enviamos nuestras tablas a DB

4 -volvemos a tinker y crearemos 30 posts
	factory(App\Post::class, 30)->create()

5 configuramos rutas y metods

-Route::get(’/eloquent’, function () { TODOS LOS CAMPOS
$posts = Post::all();

-Route::get(’/eloquent’, function () { TODOS LOS CAMPOS MAYORES A 20
$posts = Post::where(“id”, “>=”, “20”)->get();

-Route::get(’/eloquent’, function () { TODOS LOS CAMPOS MAYORES A 20 DE MAY A MEN
$posts = Post::where(“id”, “>=”, “20”)
->orderBy(“id”,“desc”)
->get();

Route::get(’/eloquent’, function () { campos 30 29 28
$posts = Post::where(“id”, “>=”, “20”)
->orderBy(“id”,“desc”)
->get();

Aquí hay mas documentación https://laravel.com/docs/7.x/eloquent

Excelentee xplicacion, me dio muchos problemas por que estoy en laravel 8 pero nada que la comunidad no me pudiera ayudar.

Creo que por fin lo he entendido. Cualquier cosa corregirme, que estaré encantada de aprender.
Para tenerlo claro, por un lado:
1º. Hay que crear una base de datos en phpMyAdmin
2º. Asociarla la DB, a nuestro proyecto en el archivo de env.  DB_DATABASE=
Y por otro:
1º. Crear un modelo con nombre de la tabla, en la terminal. (Así se crea la tabla)
2º. En la carpeta de migraciones, tenemos el modelo. Aquí podemos modificar los atributos de la tabla.
3º. Ejecutando el comando de migrate, se realizan los cambios en la tabla que hay en la DB.

Si aparece el error “Specified key was too long error” al ejecutar el comando php artisan migrate, se debe añadir en el fichero “app\Providers\AppServiceProvider.php”:


use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

public function boot()
{
Schema::defaultStringLength(191);
}

Referencia: https://aprendible.com/blog/como-solucionar-el-error-specified-key-was-too-long-error-en-laravel

El método take es similar al limit el cual trae un número determinado de registros que le asignamos.

Cuando se esta realizado el print de los datos, se tiene que llamar a

use App\Models\Post;

Esta es una actualización de Laravel.

Utilizando las migraciones, como hago para actualizar una tabla ya existente? se puede hacer eso?

Bueno pues a mi no me permitio visualizar la informacion igual que al profesor, por lo que puedo entender es algo en la ruta,estoy manejando XAMPP y veo a muchos compañeros con el mismo problema 😦 En la anterior seccion no hubo pobrema ya que ingresaba al Service.php y podia realizar lo mismo que el profesor pero en este caso por mas que intente no fue posible 😐

Por alguna razón que desconozco la tabla de post no se migro a la base de datos y tuve que crearla manual, esta no arrojaba ningun error ni nada y me decia que ya estaba creada pero no aparecia en la base de datos. de resto todo perfecto

Gracias al factory, podemos configurar datos falsos para realizar pruebas, para esto primero debemos de configurar el archivo de factory correspondiente al modelo

La consola de comandos de Laravel nos permite crear varias cosas de una vez, para crear un modelo, con su migracion y su factory de una mes es cuestion de agregarle los parametros opcionales requeridos
por ejemplo:

php artisan make:model Post -m -f

La ruta de los factories es:

database > factories > archivoFactory.php

Teniendo una base de datos existente, existe alguna manera para hacer una inversa y crear las migraciones, o se haria manualmente las migraciones, y hacer un backup de los datos existentes, o exite algun tipo de comando ?

hola como puedo hacer para ver lo de las rutas usando xampp porque el escribe eloquen.test/eloquent y lo puede ver pero yo no puedo hacer eso alguien me ayuda?

El profesor lo repitio mil veces, estamos haciendo un ejercicio para practicar, para entender el poder de Elloquent.
.
Para ello y por facilidad de la explicacion estamos usando el archivo de rutas web y aplicando un closure a la ruta.
.
Pero ya aprendimos que este codigo debe vivir dentro del controlador .

Dejo por aqui este aporte, porque internet no olvida nada 😉
.

.
Y este es el nuevo fakerPHP

Para los datos con faker en laravel 9

public function definition()
{
return [
//Crea datos para pruebas
’title’ => $this->faker->sentence
];
}

Corrección el minuto 4:01, no va a crear una nueva tabla, va a crear/agregar una nueva columna a la tabla de posts.

Para crear un modelo, el factory y la migración en un proyecto de Laravel, hacemos uso del siguiente comando:

php artisan make:model Post -m -f

Post hace referencia al nombre de mi modelo (una buena práctica es colocarlo en singular).


-m hace referencia a la creación de la migración


-f hace referencia a la creación de mi factory

A mi me funcionó de la siguiente manera

factory(App\Post::class, 48)->create();

cómo puedo hacer para que por defecto al crear los modelos se creen, por ejemplo, en App\Models?

Route::get('eloquent', function () {
    $posts = Post::where('id','>=','10')
    ->orderBy('id','DESC')
    ->take(3)
    ->get();

    foreach ($posts as $post) {
        echo "$post->id $post->title <br>";
    }
});

Cuando trabajamos con eloquent ORM debemos tener en cuenta que un archivo(app/Models/Post.php) representa una tabla en nuestra base de datos.📌

Lo más importante en cualquier sistema es la correcta manipulación de datos.✌

El profe explica tan bien que todavía no hay preguntas 😄

Documentacion de Eloquent para Laravel 8: https://laravel.com/docs/8.x/eloquent

Hola, tengo un error a la hora de ejecutar php artisan migrate :
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: select * from information_schema.tables where table_schema = eloquent and table_name = migrations and table_type = ‘BASE TABLE’)

Me podrian ayudar, estoy usando Homestead, la version de laravel es v8 .

Parece que ahora para test se usa la clase Factory en Models
https://laravel.com/docs/7.x/database-testing

Con los Factory, Laravel nos facilita las pruebas.

No sería más prolijo contar con todos los modelos dentro de un directorio Models? algo como App\Models? qué opinan?

Laravel permite consultar información en las bases de datos sin digitar ni una línea de SQL, tocara que aprender nuevos métodos.

cuando dígito en la terminal el comando, php artisan migrate me está saliendo el siguiente error, alguien me puede ayudar a solucionar este error por favor Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

C:\xampp\htdocs\eloquent\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669

//If an exception occurs when attempting to run a query, we’ll format the error
// message to include the bindings with SQL, which will make this exception a
//lot more helpful to the developer instead of just the database’s errors.
catch (Exception $e) {
throw new QueryException(
$query, $this->prepareBindings($bindings), $e
);
}

Exception trace:

PDOException:😦“SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes”)
C:\xampp\htdocs\eloquent\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463

PDOStatement::execute()
C:\xampp\htdocs\eloquent\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463

Please use the argument -v to see more details.

Si queremos saber que otras opciones podemos tener en los comandos solo basta con adicionarl al final el comando –help
ejemplo:

php artisan make:model --help

Al momento de crear un modelo este debe de nombrarse en inlges y singular, ya que al momento de crear las migraciones automáticas el comando genera las tablas agregándole una s para que quede en plural en la BD

Excelente el uso de eloquent

Si están usando Laravel 7.x.x y tienen conflictos al migrar el modelo Post a la base de datos, actualicen la siguiente ruta:

app\Providers\AppServiceProvider.php

Actualicenlo con el siguiente código:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
}

Y luego ejecuten php artisan migrate. 😃

Que “poderoso” me ha parecido hasta ahora Laravel, y con Eloquent aún más. Me está encantando este framework y también el curso.

Por si alguien más se encuentra con un error parecido a este:

 Illuminate\Database\QueryException 

  could not find driver (SQL: select * from information_schema.tables where table_schema = eloquent and table_name = migrations and table_type = 'BASE TABLE')

a la hora de hacer las migraciones en una distribución basada en arch, la solución es bastante simple, solo que algo difícil de encontrar.
Solo hay que editar el archivo /etc/php/php.ini y descomentar las siguientes líneas:

;extension=pdo_mysql
;extension=pdo_sqlite

PD: Para descomentarlas solo hay que eliminar el punto y coma al principio de la línea.

Dejo por aquí el link de los Query Builder que ofrece Laravel.

Creo que es muy importante conocer cómo y en que forma podemos hacer querys para comunicarnos con la base de datos.