Triggers en Laravel para crear una url_path

triggers

Desencadenadores en Laravel para crear una url_path única para categorías

Creando los disparadores (triggers) en Laravel para generar la ruta URL para categorías usando su slug.


En primer lugar, tengo la siguiente estructura de base de datos para la tabla de categorías.

triggers

Entonces, vamos a generar la URL para las categorías de acuerdo con su slug y el de los padres. Por ejemplo, si el nombre de la categoría es “Belleza”, mientras que su slug es belleza, el disparador generará el valor url_path a la belleza. Del mismo modo, si el nombre de la categoría “Maquillaje” son subcategorías de la categoría “Belleza” mencionada anteriormente con su slug es maquillaje, entonces el disparador generará la url_path belleza / maquillaje. De esta manera, el disparador concatenará el valor de la ruta de URL de acuerdo con su valor de ruta de URL principal o colocará el valor de slug en su valor de ruta de URL si es la categoría principal.

La imagen de abajo aclara el párrafo mencionado anteriormente.

triggers

Vamos a codificar

Debe conocer los triggers SQL antes de sumergirse en este artículo.

Luego, cree las siguientes dos migraciones que crearán la tabla de categorías y el activador para la columna de la tabla de categorías url_path.

a. Migración de tablas de categorías

<?php

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

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->integer('position');
            $table->string('name', 191)->index();
            $table->string('slug', 191)->unique();
            $table->string('image', 191)->nullable();
            $table->text('description')->nullable();
            $table->boolean('status')->default(1);
            $table->text('meta_title')->nullable();
            $table->longText('meta_description')->nullable();
            $table->text('meta_keywords')->nullable();
            $table->string('url_path', 255)->nullable()->comment('Maintained by database triggers');
            $table->foreignId('parent_id')->index()->nullable()->constrained('categories')->onDelete('cascade');
            $table->index(['status', 'url_path']);
            $table->index(['position', 'status']);
            $table->timestamps();
        });
    }

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

Migración de tablas de categorías

b. Agregar disparador a la migración de la tabla de categorías

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;


class AddTriggersToCategories extends Migration
{
    /**
    * Run the migrations.
    *
    * @return void
    */
    public function up()
    {
        DB::unprepared('DROP TRIGGER IF EXISTS `add_url_path`');
        DB::unprepared('CREATE TRIGGER add_url_path BEFORE INSERT ON categories
            FOR EACH ROW
            BEGIN
                DECLARE urlPath VARCHAR(255);

                IF NEW.parent_id IS NULL
                THEN
                    SET NEW.url_path = LOWER(NEW.slug);
                ELSE
                    SELECT url_path INTO urlPath FROM
                    categories WHERE categories.id = NEW.parent_id;

                    SET NEW.url_path = LOWER(concat(urlPath, "/", NEW.slug));
                END IF;

            END
        ');


        DB::unprepared('DROP TRIGGER IF EXISTS `update_url_path`');
        DB::unprepared('CREATE TRIGGER update_url_path BEFORE UPDATE ON categories
            FOR EACH ROW
            BEGIN
                DECLARE urlPath VARCHAR(255);

                IF NEW.parent_id IS NULL
                THEN
                    SET NEW.url_path = LOWER(NEW.slug);
                ELSE
                    SELECT url_path INTO urlPath FROM
                    categories WHERE categories.id = NEW.parent_id;

                    SET NEW.url_path = LOWER(concat(urlPath, "/", NEW.slug));
                END IF;

            END
        ');
    }

    /**
    * Reverse the migrations.
    *
    * @return void
    */
    public function down()
    {
        DB::unprepared('DROP TRIGGER IF EXISTS `add_url_path`');
        DB::unprepared('DROP TRIGGER IF EXISTS `update_url_path`');
    }
}

Agregar disparador a la tabla de categorías


La palabra clave NEW en la migración de triggers es un nombre de pseudoregistro que hace referencia a la nueva fila de la tabla para operaciones de inserción y actualización en desencadenadores de nivel de fila.

En el archivo de migración de disparador anterior, el disparador SQL se crea antes de insertar o actualizar los valores en la tabla de categorías. El código dentro de BEGIN .. END se explica a continuación.

Primero declaramos la variable urlPath en la transacción sql. Después de eso, verificamos si el parent_id de la fila de inserción o actualización es nulo o no para determinar la categoría raíz.

Si se trata de una categoría raíz, establecemos el valor de url_path (NEW.url_path) en el slug (NEW.slug) de esa categoría raíz de inserción / actualización; de lo contrario, seleccionaremos el valor de url_path de la categoría principal con la ayuda de la instrucción select de sql y asignaremos en la variable urlPath y concatenarlo con el nuevo slug de la fila de inserción / actualización.

De esta manera, podemos simplemente crear un valor url_path usando el disparador SQL en Laravel.

Recent Post