Triggers en Laravel para crear una url_path

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

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.

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


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.

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]