Tornar al Blog

laravel blog

Categoria: codes | Publicat el 19 Jul, 2024
laravel blog

Para crear un sistema de blog simple en Laravel con tablas relacionadas para categorías, etiquetas, publicaciones y una tabla pivote para las etiquetas de las publicaciones, sigue los pasos a continuación. Vamos a definir las migraciones y los modelos necesarios para estas tablas y sus relaciones.

Paso 1: Crear las Migraciones

Primero, crea las migraciones para las tablas.

php artisan make:migration create_categories_table
php artisan make:migration create_tags_table
php artisan make:migration create_posts_table
php artisan make:migration create_post_tag_table

Luego, edita las migraciones para definir la estructura de las tablas.

Migraciones Actualizadas

create_categories_table.php

<?php

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

class CreateCategoriesTable extends Migration
{
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('svg');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('categories');
    }
}


create_tags_table.php

<?php

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

class CreateTagsTable extends Migration
{
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('svg');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('tags');
    }
}


create_posts_table.php

<?php

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

class CreatePostsTable extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->foreignId('category_id')->constrained()->onDelete('cascade');
            $table->string('excerpt', 500);
            $table->text('content');
            $table->string('img')->nullable();
            $table->string('url')->nullable();
            $table->string('ins')->nullable();
            $table->string('face')->nullable();
            $table->string('youtube')->nullable();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}


create_post_tag_table.php

<?php

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

class CreatePostTagTable extends Migration
{
    public function up()
    {
        Schema::create('post_tag', function (Blueprint $table) {
            $table->id();
            $table->foreignId('post_id')->constrained()->onDelete('cascade');
            $table->foreignId('tag_id')->constrained()->onDelete('cascade');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('post_tag');
    }
}

Modelos con Relaciones

Vamos a actualizar los modelos para reflejar las relaciones entre estas tablas.


Category.php

<?php

namespace App\Models;

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

class Category extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'svg'];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}


Tag.php

<?php

namespace App\Models;

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

class Tag extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'svg'];

    public function posts()
    {
        return $this->belongsToMany(Post::class, 'post_tag');
    }
}


Post.php

<?php

namespace App\Models;

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

class Post extends Model
{
    use HasFactory;

    protected $fillable = [
        'title', 'category_id', 'excerpt', 'content', 'img', 'url', 'ins', 'face', 'youtube'
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class, 'post_tag');
    }
}

Ejecutar las Migraciones

Ejecuta las migraciones para crear las tablas en la base de datos.

php artisan migrate

Opcional: Seeder para Poblar Datos

Para poblar las tablas con datos de prueba, puedes crear seeders. Aquí tienes un ejemplo para DatabaseSeeder.php:


DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Category;
use App\Models\Tag;
use App\Models\Post;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $categories = Category::factory(5)->create();
        $tags = Tag::factory(10)->create();

        Post::factory(20)->create()->each(function ($post) use ($tags) {
            $post->tags()->attach($tags->random(3));
        });
    }
}


Factory para Category, Tag y Post

Crea factories para generar datos de prueba:

php artisan make:factory CategoryFactory
php artisan make:factory TagFactory
php artisan make:factory PostFactory

Luego, define los factories.


CategoryFactory.php

<?php

namespace Database\Factories;

use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;

class CategoryFactory extends Factory
{
    protected $model = Category::class;

    public function definition()
    {
        return [
            'name' => $this->faker->word,
            'svg' => '<svg></svg>',
        ];
    }
}


TagFactory.php

<?php

namespace Database\Factories;

use App\Models\Tag;
use Illuminate\Database\Eloquent\Factories\Factory;

class TagFactory extends Factory
{
    protected $model = Tag::class;

    public function definition()
    {
        return [
            'name' => $this->faker->word,
            'svg' => '<svg></svg>',
        ];
    }
}


PostFactory.php

<?php

namespace Database\Factories;

use App\Models\Post;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    protected $model = Post::class;

    public function definition()
    {
        return [
            'title' => $this->faker->sentence,
            'category_id' => Category::factory(),
            'excerpt' => $this->faker->text(200),
            'content' => $this->faker->paragraphs(3, true),
            'img' => $this->faker->imageUrl(),
            'url' => $this->faker->url,
            'ins' => $this->faker->url,
            'face' => $this->faker->url,
            'youtube' => $this->faker->url,
        ];
    }
}

Ejecutar los Seeders

Ejecuta los seeders para poblar la base de datos.

php artisan db:seed

Con estos pasos, has configurado un sistema de blog básico en Laravel con categorías, etiquetas, publicaciones y una tabla pivote para las etiquetas de las publicaciones. Ahora puedes explorar y aprender cómo funcionan las relaciones en Laravel. ¡Diviértete aprendiendo!

Etiquetes:

#bbdd #model #controller

Articles Relacionats

Resum per importar fitxers CSV de comptabilitat a la base de dades autonomo_contabilidad amb Python
Resum per importar fitxers CSV de comptabilitat a la base de dades autonomo_contabilidad amb Python Aquest script en Python importa dades d'un fitxer CSV (com `compartit 3tr-2025 - VENDA.csv`) a la base de dades MySQL `autonomo_contabilidad`, utilitzant l'esquema de taules `wp_contabilidad_clientes`, `wp_contabilidad_empleados`, `wp_contabilidad_productos`, `wp_contabilidad_ventas` i `wp_contabilidad_detalles_venta`.
Quina és la diferència entre PDO i MySQLi?
Quina és la diferència entre PDO i MySQLi? El que no està tan definit és quina és la millor manera de connectar-se a MySQL fent servir PHP. A priori en destaquen dues:MySQLi, PDO
sql expert
sql expert ChatGPT SQL Expert és una eina avançada per optimitzar bases de dades, escriure consultes SQL eficients i resoldre problemes de rendiment. Ideal per a desenvolupadors, DBA i DevOps que busquen solucions ràpides i precises. 🚀
migrations
migrations la migracio crea i administra les taules a la base de dades de laravel
laravel model amb relacio belongsTo un a un
laravel model amb relacio belongsTo un a un Les taules d'una base de dades sovint estan relacionades les unes amb les altres. Per exemple, un usuari pot estar associat a una professió i una professió pot tenir molts usuaris associats. Utilitzant l'ORM Eloquent podem fer que aquest procés sigui molt més fàcil, treballant amb les relacions directament dins dels nostres models (usant Programació Orientada a Objectes ) i creant mètodes personalitzats que ens evitaran haver de construir consultes de forma manual.
mysql
mysql puc gestionar les bases de dades amb: workbench, phpmyadmin o table plus.