
Hablemos de la relación belongToMany. Recientemente creamos una introducción genial para crear un sitio web para compartir enlaces en Laravel. El tutorial cubre muchos conceptos, incluidos enrutamiento, modelos, controladores y creación de vistas. Incluso cubrimos algunas relaciones bĆ”sicas en Eloquent. Una cosa que no cubrimos fue la aplicación de muchas a muchas relaciones usando el mĆ©todo pertenece a muchos . Veamos cómo podrĆamos hacer esto ahora.
- # Agregue el pertenece a muchos a su primer modelo.
- #Cree el modelo elocuente asociado .
- # Crear una migración para la tabla de etiquetas y la tabla dinÔmica.
- # Migrar la base de datos.
- #Configure El inverso pertenece a muchos en el modelo de etiqueta.
- # Pon a prueba nuestra relación con Tinker .
- #Update El mƩtodo create () MƩtodo para el soporte de etiquetas con
lists()
. - #Actualice la vista Crear formulario para compatibilidad con etiquetas.
- #Update El mƩtodo store () para Tag Support con
attach()
. - #Update El mƩtodo edit () para Tag Support con
lists()
. - #Actualice la vista Editar formulario para compatibilidad con etiquetas.
- #Update El mƩtodo update () para Tag Support con
sync()
. - # Actualice la vista Mostrar para el soporte de etiquetas.
- # Haga que el cuadro de selección de etiquetas sea bonito .
# Paso 1: Agregue el belongToMany a su primer modelo
En este ejemplo pertenece a muchos , estamos tratando con un Link.php
modelo elocuente y queremos poder asociar ese modelo con muchas etiquetas segĆŗn sea necesario. Simplemente abrimos nuestro modelo Link.php y agregamos el siguiente fragmento.
# Paso 2: Crear el modelo elocuente asociado
Acabamos de agregar una relación ApplicaToMany en el modelo Link que hace referencia al modelo Tag. Ese modelo de etiqueta aún no existe, asà que creémoslo ahora.
vagabundo @ homestead: ~ / Code / laravel $ php artisan make:model Tag
# Paso 3: Cree una migración para la tabla de etiquetas y la tabla dinÔmica.
Sabemos que las relaciones de muchos a muchos requieren una tabla dinÔmica. Es decir, necesitamos una tabla arbitraria para realizar búsquedas para ver qué enlace estÔ relacionado con qué etiqueta y viceversa.
vagabundo @ homestead: ~ / Code / laravel $ php artisan make:migration create_tags_table --create=tags
Descargo de responsabilidad: las nuevas migraciones son fĆ”ciles, sin embargo, agregar migraciones a proyectos existentes me asusta. Ejecutar migraciones en una base de datos poblada puede ser un poco arriesgado cuando no estĆ” seguro de cuĆ”l serĆ” el resultado. La comida para llevar? ¡Haga una copia de seguridad de su base de datos temprano y con frecuencia!
De todos modos, el archivo de migración se crea para nosotros, pero aún no se completa con el esquema correcto. Necesitamos hacer esto por nuestra cuenta, asà que hagÔmoslo ahora. Lo haremos:
- agregue un tipo de cadena para el nombre de la etiqueta
- AƱadir esquema para permitir la tabla dinƔmica
- siga la convención de nomenclatura para tablas dinÔmicas
- configurar dos columnas, una para link_id y otra para tag_id
- agregar marcas de tiempo a la tabla dinƔmica
- agregue la capacidad de eliminar en cascada si un enlace se elimina a travƩs de una clave externa
Nota: La convención para una tabla dinĆ”mica es usar la versión singular de las dos tablas que estamos tratando de conectar, y estĆ”n en orden alfabĆ©tico. En nuestro caso, tenemos una tabla de enlaces y una tabla de etiquetas a las que nos gustarĆa unirnos. Entonces, si aplicamos las versiones singulares en orden alfabĆ©tico unidas con un guión bajo, eso nos dalink_tag
. AquĆ estĆ” el resultado de nuestros objetivos.
# Paso 4: migrar la base de datos
Este es un paso bastante fƔcil, solo escribe php artisan migrate
en la terminal.
# Paso 5: Configurar el reverso pertenece a muchos en el modelo de etiqueta
Ya configuramos nuestro Links.php
modelo para permitir una relación belongToMany . Esto significa que un enlace puede tener muchas etiquetas. Lo mismo es cierto para una etiqueta. Una etiqueta puede tener muchos enlaces. Ahora configuremos nuestro Tag.php
modelo para permitir esto.
# Paso 6: Pruebe nuestra relación con Tinker
Con Laravel, es muy fĆ”cil probar cosas en la lĆnea de comandos usando php artisan tinker
. Usemos tinker para probar nuestra nueva funcionalidad ahora. Preste atención a los métodos audaces, ya que son importantes cuando se trata de la relación pertenece a muchos.
vagrant @ homestead: ~ / Code / laravel $ php artisan tinker
Crea una nueva etiqueta.
>>> $ tag = nueva aplicación \ Tag; AsĆgnele un nombre. >>> $ etiqueta-> nombre = 'jQuery'; => "jQuery"
Guarde esa etiqueta.
>>> $ etiqueta-> guardar (); => verdadero >>> Aplicación \ Etiqueta :: all () -> toArray (); => [ [ "id" => 1, "name" => "jQuery", "created_at" => "2015-06-23 14:28:55", "updated_at" => "2015-06-23 14:28:55" ] ] >>>
Enumere las etiquetas.
>>> Aplicación \ Etiqueta :: listas ( 'nombre' ) ; =>[ "jQuery" ] >>>
Cree otra etiqueta, nombre y guƔrdelo.
>>> $ tag = nueva aplicación \ Tag; =>{} >>> $ etiqueta-> nombre = 'php'; => "php" >>> $ etiqueta-> guardar (); => verdadero >>>
Enumere nuestras etiquetas nuevamente. Tenga en cuenta que ahora tenemos dos.
>>> Aplicación \ Etiqueta :: listas ( 'nombre' ) ; =>[ "jQuery", "php" ] >>>
Obtenga el primer enlace de nuestra base de datos. (Nota: ya tenĆamos este enlace en nuestra base de datos; cree el suyo propio para seguirlo).
>>> $ enlace = Aplicación \ Enlace :: primer () =>{ id: 6, category_id: 1, nombre: "Laravel PHP Framework", url: "http://laravel.com", created_at: "2015-06-06 21:41:33", updated_at: "2015-06-12 00:52:05", user_id: 1, slug: "laravel-php-framework", outbound_count: 3, descripción: "Laravel es un marco PHP moderno y poderoso con una elegante sintaxis para el desarrollo rÔpido de aplicaciones y la creación de prototipos. Laravel hace uso de los mejores paquetes disponibles en la comunidad PHP para proporcionar un entorno de desarrollo fantÔstico para usuarios de todos los niveles". } >>>
Asocia una etiqueta a ese enlace.
>>> $ enlace-> etiquetas () -> adjuntar ( '2' ) ; => nulo >>>
Obtenga todas las entradas en nuestra tabla dinÔmica (funcionó).
>>> DB :: select ('seleccionar * de link_tag'); => [{ link_id: 6, tag_id: 2, created_at: "2015-06-23 14:48:29", updated_at: "2015-06-23 14:48:29" } ] >>>
Mostrar las etiquetas asociadas a este enlace.
>>> $ enlace-> etiquetas-> toArray (); => [ [ "id" => 2, "nombre" => "php", "created_at" => "2015-06-23 14:41:10", "updated_at" => "2015-06-23 14:41:10", "pivote" => [ "link_id" => 6, "tag_id" => 2, "created_at" => "2015-06-23 14:48:29", "updated_at" => "2015-06-23 14:48:29" ] ] ] >>>
Enumere los nombres de las etiquetas en este enlace.
>>> $ enlace-> etiquetas-> listas ( 'nombre' ) ; =>[ "php" ] >>>
Encuentra la etiqueta php en la base de datos.
>>> $ tag = App \ Tag :: find ('2'); =>{ id: 2 nombre: "php", created_at: "2015-06-23 14:41:10", updated_at: "2015-06-23 14:41:10" } >>>
Muestra quƩ enlaces estƔn asociados con esta etiqueta.
>>> $ etiqueta-> enlaces-> toArray (); => [ [ "id" => 6, "category_id" => 1, "name" => "Laravel PHP Framework", "url" => "http://laravel.com", "created_at" => "2015-06-06 21:41:33", "updated_at" => "2015-06-12 00:52:05", "user_id" => 1, "slug" => "laravel-php-framework", "outbound_count" => 3, "description" => "Laravel es un marco PHP moderno y potente con una elegante sintaxis para el desarrollo rÔpido de aplicaciones y la creación de prototipos. Laravel utiliza los mejores paquetes disponibles en la comunidad PHP para proporcionar un entorno de desarrollo fantÔstico para usuarios de todos los niveles de habilidad ". "pivote" => [ "tag_id" => 2, "link_id" => 6 ] ] ] >>>
Muy dulce. Al usar tinker, podemos ver que todas las nuevas funcionalidades que agregamos para la relación belongToMany en losmodelosLink.php
yTag.php
estƔn funcionando.
# Paso 7: Actualice el mƩtodo Crear controlador para compatibilidad con etiquetas
En el paso anterior, tenemos una pequeƱa prueba de concepto, ya que parece funcionar correctamente cuando se usa Tinker. Nuestra vista, que muestra el formulario para crear un nuevo enlace, estarƔ esperando una $tags
variable que podemos usar como segundo argumento para Form :: select . Asegurémonos de proporcionarles el código en este método.
Este paso asegura que seleccionamos todas las etiquetas disponibles para seleccionar cuando visitamos la vista para crear un nuevo enlace.
# Paso 8: actualice el formulario de creación para compatibilidad con etiquetas
Ahora podemos permitir el soporte de etiquetas belongToMany en la interfaz de usuario. En el formulario que usamos para crear un nuevo enlace, agreguemos el siguiente fragmento.
Preste atención a la lista de argumentos Form :: select . El primer argumento es el nombre del elemento seleccionado. Le agregamos la notación de matriz para permitir que este elemento de selección maneje el paso de múltiples valores a la vez a través de una matriz. El segundo argumento son los valores predeterminados que llenarÔn la lista. Establecimos esto en $tags
, y mostramos cómo llenar esa variable en el paso anterior. El tercer argumento especifica los elementos seleccionados en la lista. Para una nueva entrada, podemos dejar esto en nulo. Para un formulario de estilo de actualización, este deberÔ tener los valores de las etiquetas actualmente seleccionadas. El cuartoEl argumento es el método familiar de pasar una matriz que contiene atributos y valores adicionales que deben asignarse al elemento.
Con tanto nuestro formulario como nuestro controlador ahora actualizados para admitir etiquetas a travƩs de nuestro trabajo paymentsToMany, podemos verificar en el navegador para asegurarnos de que todo estƩ funcionando.
# Paso 9: Actualice el mƩtodo store () para el soporte de etiquetas
Ahora que tenemos nuestra base de datos lista para admitir etiquetas con muchas a muchas relaciones y una tabla dinĆ”mica, junto con un formulario que muestra las etiquetas para que las seleccionemos, debemos asegurarnos de que cuando enviemos el formulario para almacenar una nueva entrada en la base de datos que maneja procesa las etiquetas correctamente. Puede verse mĆ”s o menos asĆ:
El método clave al que debe prestar atención es el attach()
mƩtodo. Esto es lo que se encarga de aceptar la entrada de etiquetas y asociarla al recurso dado. El mƩtodo attach () es perfecto para crear el recurso inicial en la base de datos.
# Paso 10: Actualice el mƩtodo edit () para Tag Support.
Esto podrĆa manejarse con Route Model Binding, pero aĆŗn no lo tenemos configurado en nuestro proyecto. AquĆ hay un ejemplo de cómo puede llenar las etiquetas seleccionadas actualmente para usarlas en un formulario de estilo de edición o actualización. O, por supuesto, podrĆamos refactorizar esto para mejorarlo mucho, pero por ahora, esto funcionarĆ”.
# Paso 11: Actualice la vista Editar formulario para compatibilidad con etiquetas.
En este paso, nos aseguramos de que el tercer argumento incluye todos los valores para las etiquetas seleccionadas, $currentTags
. De esta manera, si tiene un recurso que ya tiene varias etiquetas seleccionadas, cuando vaya a editar ese recurso en un formulario, esto se reflejarĆ” en la interfaz de usuario y podrĆ” agregar y eliminar etiquetas segĆŗn sea necesario desde allĆ.
# Paso 12: Actualice el mƩtodo update () para la compatibilidad con etiquetas
Cuando se trata de una relación de varios a varios en el contexto de una actualización de recursos , es posible que adjuntar no sea la mejor solución. En este caso, queremos poder eliminar y agregar elementos a la tabla dinÔmica simultÔneamente durante una actualización. En otras palabras, queremos sincronizar la base de datos con nuestra entrada. En este caso usamos el sync()
mĆ©todo. Un ejemplo de esto podrĆa ser algo como esto:
# Paso 13: Actualice la vista Mostrar para compatibilidad con etiquetas
En un momento, presionaremos el botón de envĆo con dos etiquetas seleccionadas para probar nuestros nuevos superpoderes. Primero, actualice la vista que muestra un enlace para que tambiĆ©n muestre las etiquetas que asignamos durante el proceso de creación. Simplemente agregamos el siguiente fragmento donde queremos que se muestren las etiquetas y estaremos listos.
¡Podemos ver que funciona como un encanto!
# Paso 14: Haga que el cuadro de selección de etiquetas sea bonito
Tenemos una solución de trabajo en este momento, pero el cuadro de selección como se ve en este momento no es realmente ideal. Hagamos uso de un fantĆ”stico complemento de jQuery llamado Select2 para que podamos embellecer el cuadro de selección y convertirlo en un elemento de interfaz de usuario de selección de etiqueta familiar. Es increĆblemente fĆ”cil de hacer. Para este ejemplo, simplemente agregamos los siguientes fragmentos a nuestro diseƱo maestro.
Coloque este fragmento en la sección del encabezado:
Luego, coloque esto en el pie de pƔgina:
Finalmente, actualice el elemento de selección particular que le interesa para tener una identificación a la que pueda apuntar el complemento select2. Usamos prettify como id, por lo que podemos aplicarlo a nuestra selección asĆ:
Por supuesto, esta es simplemente una forma rĆ”pida y sucia de hacer que esto funcione con un mĆnimo esfuerzo. Puede ser mejor usar Gulp y Elixir al implementar esto en producción para manejar la compilación y minificación de activos.
Con esta simple adición, podemos ver que nuestras etiquetas ahora se ven ridĆculamente increĆbles.
MÔs recursos útiles
Los siguientes enlaces se aplican directamente a este episodio y deberĆan ser muy Ćŗtiles para usted.
http://laravel.com/-docs/master/eloquent-relationships#many-to-many
http://laravel.com/-docs/master/eloquent#defining-models
https://laracasts.com/-series / laravel-5-fundamentales
AdemÔs, puede ser útil echar un vistazo al código fuente de los métodos relevantes que utilizamos en este tutorial.
liza()
adjuntar()
sincronizar ()
Laravel pertenece a muchos ejemplos Conclusión
En este episodio, cubrimos algunas caracterĆsticas realmente geniales de trabajar con Laravel y establecer relaciones de muchos a muchos utilizando la relación belongToMany. Ahora tenemos un buen plan o libro de jugadas, si lo desea, para adoptar un enfoque paso a paso para agregar apoyo de muchos a muchos para un proyecto. Gracias por revisar el tutorial.
No hay comentarios.:
Publicar un comentario