No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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
Recursos

Aportes 48

Preguntas 5

Ordenar por:

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

<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.