voyager create backpack adminlte php laravel laravel-5 one-to-many backpack-for-laravel

php - create - laravel erp



Agregue uno a muchos en forma-mochila laravel (4)

Necesitará tener parte de su lógica en JavaScript. En su ejemplo, cuando hace clic en el botón "Agregar otra coincidencia", manipulará el HTML DOM y duplicará el cuadro "Agregar coincidencia".

Después de completar todo el formulario, se enviará al servidor.

El servidor necesita:

  1. Crea un nuevo objeto de Torneo y guárdalo.

  2. Haz un bucle a través de las coincidencias enviadas y crea nuevos objetos de coincidencias y vincúlalas al torneo creado previamente. Pasa por los conjuntos enviados y vincúlalos al partido creado.

Estoy usando Backpack for Laravel para proporcionar el área de backend de mi sitio web laravel.

Tengo las siguientes tablas en la estructura de mi base de datos:

Esto es para agregar conjuntos a un partido y agregar partidos a un torneo.

Estos son mis Modelos :

Modelo de Torneo:

<?php namespace App/Models; use Illuminate/Database/Eloquent/Model; use Backpack/CRUD/CrudTrait; class Tournament extends Model { use CrudTrait; /* |-------------------------------------------------------------------------- | GLOBAL VARIABLES |-------------------------------------------------------------------------- */ protected $fillable = [''from'', ''to'', ''type'', ''location'', ''place'']; /* |-------------------------------------------------------------------------- | RELATIONS |-------------------------------------------------------------------------- */ public function matches() { return $this->hasMany(''App/Models/Match''); } }

Modelo de coincidencia:

<?php namespace App/Models; use Illuminate/Database/Eloquent/Model; use Backpack/CRUD/CrudTrait; class Match extends Model { use CrudTrait; /* |-------------------------------------------------------------------------- | GLOBAL VARIABLES |-------------------------------------------------------------------------- */ protected $table = ''matches''; protected $fillable = [''opponent'']; /* |-------------------------------------------------------------------------- | RELATIONS |-------------------------------------------------------------------------- */ public function sets() { return $this->hasMany(''App/Models/Set''); } }

Establecer modelo:

<?php namespace App/Models; use Illuminate/Database/Eloquent/Model; use Backpack/CRUD/CrudTrait; class Set extends Model { use CrudTrait; /* |-------------------------------------------------------------------------- | GLOBAL VARIABLES |-------------------------------------------------------------------------- */ protected $fillable = [''self'', ''opponent'', ''index'']; public function match() { return $this->belongsTo(''App/Models/Match''); } }

Ahora me gustaría tener lo siguiente cuando creo un torneo en back-end:

Ya puedo establecer desde, hacia, tipo, ubicación y lugar. Pero ahora me gustaría la posibilidad de agregar una coincidencia y agregar conjuntos a esa coincidencia. Esto todo en una página.

Pero estoy un poco atascado sobre cómo hacer esto. ¿Alguien puede ayudarme en mi camino?


Creo que deberías diseñarlo de tal manera que el torneo se cree primero antes de que se muestre el formulario agregar coincidencia / conjunto. Todavía es posible tenerlos a todos en una forma mediante la aplicación de Ajax o Vue.js, etc.

  1. Después de que un nuevo torneo se haya agregado correctamente, oculte el formulario y muestre la nueva información del torneo junto con el nuevo formulario de coincidencia.

  2. Cuando la nueva coincidencia se haya agregado con éxito, borre la nueva forma de concordancia y cargue la nueva información de coincidencia.

Nota: Me pregunto cómo planeas permitir que se agregue al oponente.

¡Aclamaciones!


Bien, entonces lo mejor es lo que @EddyTheDove mencionó,

$match->sets()->saveMany([ new Set([''self'' => $request->set1_self, ...]); new Set([''self'' => $request->set2_self, ...]); new Set([''self'' => $request->set3_self, ...]); ]);

Pero debe hacerse de inmediato a través de Ajax, y vue.js también será increíble. Llamada de Ajax para crear un nuevo torneo, A lo largo de buscar todas las coincidencias en la misma convocatoria y adjuntar las coincidencias seleccionadas, Solicite de nuevo Ajax agregar las coincidencias al torneo que se creó en la llamada Ajax anterior.

Envíe la información del partido en una solicitud al controlador a través de ajax, donde el código anterior lo guardará. Para más conjuntos, duplicar el conjunto de html, pero no te olvides de los nombres de entrada. Proporcione algún código con el que podamos jugar.


Yo recomendaría a todos hacerlo en múltiples pasos. Crea un torneo, ve a la vista de torneo, agrega las coincidencias. Ir a una vista de coincidencia, agregar conjuntos. Mucho más fácil que lo que quieres hacer. Pero bueno, es tu aplicación y quieres hacerlo de una vez.

Habrá algunas restricciones como que solo puedes enviar un partido a la vez, para evitar mezclar tus sets. A menos que quiera usar javascript y nombrar automáticamente sus coincidencias y conjuntos.

En sus modelos (Match & Set), agregue llaves foráneas en la matriz $fillable . Es posible que los necesitemos.

Entonces, cuando envía el formulario, crea el torneo

public function save(Request $request) { $tournament = Tournament::create([ ... ]); $match = Match::create([ ''tournament_id'' => $tournament->id, ... ]); $match->sets()->saveMany([ new Set([''self'' => $request->set1_self, ...]), //foreign key auto inserted new Set([''self'' => $request->set2_self, ...]), new Set([''self'' => $request->set3_self, ...]), ]); }

Esto significa que en su forma, debe nombrar la entrada de su conjunto como

<input name="set1_self"/> <input name="set1_opponent"/>

Y así.

Ahora, si quieres hacer varias coincidencias al mismo tiempo, tendrás que encontrar la manera de nombrar tus entradas como

<input name="match1_set1_self" /> <input name="match1_set2_self" />

Y así.

Como quieres hacer todo en una sola página. Puede construir un mini SPA solo para agregar torneos, partidos y sets. La página no cambiará / volverá a cargar.