last day (15 days later) » 

2:21 PM
0
Q: Problema al intentar guardar múltiples registros en Laravel

M4uriXDTengo un problema al guardar múltiples datos en mi base de datos en mysql. El problema es que al momento de seleccionar unos checkbox no me guarda, si por ejemplo seleccione 2. Me guarda solo 1 y el de id más bajo. Me explico. Tengo 15 checkbox en total cuyo id va en incremento. (1,2,3,4) respe...

 
@Xerif. Lo hacia porque el autoincremental tambien me daba problema si borraba un registro luego el siguiente se saltaba 1. Pero de momento lo quitare aquello, no tomare el ultimo id. Por otro lado lo que tengo es eso. un select con unas opciones las cuales me muestran unos checkbox, dependiendo de cada opción es la cantidad que muestra; cada checkbox es un valor del campo nombre de mi tabla canchas y lo que tomo es su id y muestro solo el nombre. Luego selecciono una fecha y hora para la reserva de una cancha deportiva. Y finalmente guardo aquello en mi tabla horarios.
@Xerif. Debería guardarme la cantidad que selecciono, por eso trataba de tomar el ultimo id y ese agregarle la cantidad de checkbox que seleccionaba, es decir el ultimo registro de mi tabla horarios su id es 4221 el siguiente se guarda como 4222 si antes seleccioné 4 checkbox con aquello trataba que al ultimo id genere 4 registros más, para este ejemplo; de esta manera, uno tendrá id, 4222 el siguiente será 4223...
 
puedes hacer un dd($request->all()) para ver que es lo que te llega en el controlador?
 
@JorgeBowen. Actualicé la pregunta para mostrar aquello.
 
Es dificil ayudarte por no entender del todo pero, supongo que en la captura que adjuntaste, en el array check hay 3 valores, pero en los demas solo hay uno y deberian ser de igual tamaño no?
 
@JorgeBowen. Así es. Para ese ejemplo deberían ser 3, en todo. Si hubiese seleccionado solo 2 checkbox serian 2 id, 2 fechas y 2 estados_horario, y los 2 checkbox que corresponderían al campo de mi tabla, cancha_id. En concreto como resultado en mi base de datos habrían sido 2 registros nuevos. Si hubiese seleccionado 2, si fuese más obviamente serian mas los registros nuevos.
 
2:21 PM
Tienes algunos errores muy visibles, vamos por parte y comentandolo.
 
Evitemos demasiados comentarios, que te parece si nos trasladamos al chat?
 
Hola
 
Hola gracias por ayudar. ¿Bueno que errores tengo?
 
Estaba viendo que para
/*INPUT DONDE EXTRAIGO EL ULTIMO ID DE MI TABLA HORARIOS*/
<input type="number" name="id[]" value="{{$last_horario->id}}" readonly="readonly">
Nunca va tener mas de un valor porque solo estas extrayendo el ultimo id de los horarios
asi que vas a tener siempre un solo id
El otro error
/*ESTE SELECT NO SE GUARDA PERO LOS CHECKBOX SI*/
<select id="complejos" name="SelectComplejos" required="required" onchange="MuestraCanchas(event)">

<option value="">Seleccione...</option>
@foreach($complejo as $complejo)
<option value="{{$complejo->id}}" name="ListaComplejos">{{$complejo->nombre}}</option>

@endforeach
</select>
en el option no va el atributo name
y el name del select tiene que ser un array
name="SelectComplejos[]"
 
Ya lo corregí, en mi código.
<select id="complejos" name="SelectComplejos[]" required="required" onchange="MuestraCanchas(event)">

                    <option value="">Seleccione...</option>
                    @foreach($complejo as $complejo)
                    <option value="{{$complejo->id}}">{{$complejo->nombre}}</option>

                    @endforeach
   </select>
 
2:25 PM
Vale lo de la primera parte
public function mostrar($id){

$complejo = ComplejosNew::all();


$campos = CanchasComplejo::all();
$horarios = HorariosNew::all();

$last_horario = collect($horarios)->last();

if ($last_horario->id == $last_horario->id) {

$last_horario->id = $last_horario->id + 1;

} else {

return false;
}

return view('horarios.NuevoHorario')->with('complejo', $complejo)->with('campos', $campos)->with('last_horario', $last_horario);

}
Este if es inncesario no se para que lo usas
if ($last_horario->id == $last_horario->id)
Siempre dara true
 
Con respecto al extraer el id, también lo quité, pero como mencioné en un comentario. Lo usaba porque si después borraba un registro, el nuevo se me saltaba 1. O si borraba 2 o mas se me saltaba por la cantidad que borraba
Y así, pensaba que funcionaria para evitar eso
 
has un dd($horarios) para mirar la estructura
En si el last horario es para sacar el ultimo registro??
porque si quieres mas de un id tienes que usar horarios y no lasthorarios
 
Ese es el nombre que le puse a la variable nueva para extraer el ultimo id de mi tabla y sumarle +1.
Y con respecto a la estructura que me pediste me arrojó esto:
 
tienes que usar horarios para que haya mas de un id
 
HorariosNew {#343 ▼
#table: "horario"
#fillable: array:5 [▼
0 => "id"
1 => "hora_inicio"
2 => "hora_fin"
3 => "estado_horario_id"
4 => "cancha_id"
]
#connection: "mysql"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: true
#attributes: array:7 [▼
"cancha_id" => "0"
"hora_inicio" => "2018-11-01 16:00:00"
"hora_fin" => "2018-11-02 17:00:00"
"estado_horario_id" => "2"
"updated_at" => "2018-10-31 11:29:04"
"created_at" => "2018-10-31 11:29:04"
 
2:32 PM
ese objeto es de last_horarios o de horarios, porque solo veo un id
???
 
Borre la variable last_horario que utilizaba para extraer el ultimo id, por lo que ese id que muestra corresponde a $horarios
 
Osea que solo tienes un dato en esa tabla??
 
Disculpa pero a que te refieres?
 
Que en la vista que estas haces referencia a un ID ?
Estoy montandote la estructura que creo que lo he entendido
 
si ese id es el de mi tabla horario
 
2:48 PM
Vale
Ya lo tengo te lo explicare
<?php

<input type="number" name="form[$horario->id]" value="{{$horario->id]}}">

<label>Complejos</label>
<br>
<label>Seleccione un complejo</label>
<br>

/*CHECKBOX*/
<div class="DivCheckCanchas" id="DivCheckCanchas">
<label>* Seleccione una cancha o campo</label>
<br><br>
@foreach($campos as $campos)
<div id="DivCanchas" class="DivCanchas">
<input type="checkbox" data-complejo="{{$campos->complejo_id}}" id="{{$campos->nombre}}" value="{{$campos->id}}" name="form[$horario->id]['check'][]">
<label id="LabelCanchas" for="{{$campos->nombre}}">{{$campos->nombre}}</label>
Vamos a crear un array multidimensional para form[$horario->id]
alli vamos a guardar todos los datos del formulario para ese id en especifico
En el select de los complejos he quitado name="SelectComplejos" porque no queremos que aparezca en el array
Ponlo antes de los checkboxes me equivoque y los puse despues
Espera lo corrijo yo
<?php

<input type="number" name="form[$horario->id]" value="{{$horario->id]}}">

<label>Complejos</label>
<br>
<label>Seleccione un complejo</label>
<br>

/*ESTE SELECT NO SE GUARDA PERO LOS CHECKBOX SI*/
<select id="complejos" required="required" onchange="MuestraCanchas(event)">

<option value="">Seleccione...</option>
@foreach($complejo as $complejo)
<option value="{{$complejo->id}}" >{{$complejo->nombre}}</option>

@endforeach
</select>
<br><br>

/*CHECKBOX*/
<div class="DivCheckCanchas" id="DivCheckCanchas">
Tu copia esa estructura, haz un submit y muestrame el dd($request->all())
recuerda reemplazar form[$horario->id] con la variable donde este el id
he puesto $horario->id pero puede ser $last->id o como lo hayas llamado, avisame cuando hagas el dd
 
donde dice form[$horario->id] es el nombre del formulario no?
ok voy a probar
 
Si por ejemplo form[4998]['check'][]
 
3:09 PM
Con respecto a mi controlador me arroja error
 
Que te arroja??
 
public function store(Request $request){


try {

foreach ($request->get('id') as $key => $horarios) {
}
en el foreach
Invalid argument supplied for foreach()
¿Como lo debería nombrar dentro del get()?
 
bueno has el dd justo antes del try;
quiero que veas la estructura nueva del array.
para luego hacer bien el foreach
 
array:3 [▼
"_token" => "ueZizMVv2oe7A5YbOQAUbA4CUAomABf0FA5UpKqA"
"horario" => array:2 [▼
"$last_horario->id" => "5002"
"$last_horarios->id" => array:4 [▼
"'check'" => array:3 [▼
0 => "2"
1 => "4"
2 => "7"
]
"'desde'" => "2018-11-01"
"'hasta'" => "2018-11-02"
"'estado_horario_id'" => "2"
]
]
"horarios" => array:1 [▼
"$last_horarios->id" => array:2 [▼
"'sel'" => "16:00:00"
"'sel2'" => "17:00:00"
]
]
]
 
vale, creo que mejor has dd($request->form);
Alli hay cosas que se estan mezclando como el token
 
3:15 PM
Eso es utilice esa variable de nuevo, porque mi formulario está dentro de otra vista. y al pulsar sobre un botón me manda al formulario donde tengo todo esto, y si usaba solo el $horarios me traía el id de la tabla complejos porque en mi vista principal, Muestro una lista de los complejos, luego un botón para ver los detalles del complejo y sus canchas asociadas y luego otro botón el cual me manda al form de los horarios
ok
 
Vale siempre y cuando todos tus name="" en el formulario tenga la estructura
form[$last_horarios->id]
 
Pero el problema que esa variable es la que extrae el ultimo id
array:2 [▼
"$last_horario->id" => "5002"
"$last_horarios->id" => array:4 [▼
"'check'" => array:3 [▼
0 => "2"
1 => "4"
2 => "7"
]
"'desde'" => "2018-11-01"
"'hasta'" => "2018-11-02"
"'estado_horario_id'" => "2"
]
]
eso me arrojo con el dd($request->horario)
 
mmm tiene que ser dd($request->form);
porque los names que te he puesto empiezan asi name="form[$last_horario->id]"
 
A lo que me referia si lo hacia de esta manera para llenar el input del id: $horarios = HorarioNew::find($id) me traía el id de mi tabla complejos el cual pasaba con cada vista que visitaba, en la url() algo como esto localhost/Horarios/NuevoHorario/2 y ese 2 es el id del complejo en el cual en mi vista principal me mandó a la vista de los detalles, y posteriormente a la de creacion de los hORARIOS
Con respecto a lo que dices me arroja null, como te lo mostré es como lo tengo yo
en mi codigo
ya que así se llama el form en mi codigo
 
Tu lo tienes asi no
horario[$last_horario->id]
 
3:22 PM
si
 
vale jeje error mio tremendo
horario[{{$last_horario->id}}]
Asi si
 
eso en el name? no
del input
Por otro lado al extraer el ultimo id, de esta forma puedo traer el id de la tabla horarios:
$horarios = HorariosNew::all();

$last_horario = collect($horarios)->last();

if ($last_horario->id == $last_horario->id) {

$last_horario->id = $last_horario->id + 1;

} else {

return false;
}
en mi función mostrar() similar a mi funcion show()
tengo 2 una es para la vista de los horarios, y otra para la visualizar las canchas asociadas al complejo
 
Perdona me solicitaban en el trabajo jeeje
sii en el name
porque si te das cuenta en el array la key salia asi "$last_horario->id"
me olvide de las llaves {{$last_horario->id}}
Cambialo y ya hacemos el foreach
 
si lo cambie
 
ahora te hago el foreach
 
3:35 PM
pero te mencionaba lo otro porque me han dicho que no podía extraer el id y sumarle 1 si tenia el autoincremento. Que iba a repetir datos no se muy bien. Y lo hacia para que no se saltara un id con otro. Y Ahora lo puse de nuevo para hacer esto. Pensaba si estaba ¿mal otra vez?
 
Si tu tabla tiene el id autoincremental
no hace falta poner
$horarios = new HorariosNew();

$horarios->id = $request->get('id')[$key];
 
¿Esas 2 lineas?
 
public function store(Request $request){

try {

foreach($request->horario as $id_horario=>$row){
// RECORREMOS EL PRIMER NIVEL PARA SACAR LOS PRIMEROS VALORES QUE NO SON ARRAY
foreach($row->check as $check){
// HACEMOS ESTE SEGUNDO LOOP PARA SACAR TODOS LOS VALUES DEL ARRAY CHECK

$horarios = new HorariosNew();
$horarios->hora_inicio = $row->desde;
$horarios->hora_fin = $row->hasta;
$horarios->estado_horario_id = $row->estado_horario_id;
$horarios->cancha_id = $check;
$horarios->save();

//COMO SABRAS AHORA, NO HACE FALTA PONER ID, SI TU TABLA TIENE AUTOINCREMENT, NO ES NECESARIO
Ahi lo tienes
 
mmmm me arroja otro error
Trying to get property 'check' of non-object
Te muestro como tengo el codigo yo
{!! Form::open(['route'=> 'horarios.store','method'=> 'POST' ,'class'=>"form-material m-t-40",'name'=>'horario', 'id'=>'horario_id', 'files' => true] ) !!}

<div>

<label style="color: black; ">Complejos</label>
<br>
<label style="color: grey;">Seleccione un complejo</label>
<br>
<select id="complejos" required="required" onchange="MuestraCanchas(event)">

<option value="">Seleccione...</option>
@foreach($complejo as $complejo)
<option value="{{$complejo->id}}">{{$complejo->nombre}}</option>

@endforeach
Y el controlador lo deje como me dijiste
 
Vale amigo error mio
no es un objeto es un array
 
3:49 PM
public function store(Request $request){



try {

foreach($request->horario as $id_horario=>$row){

// RECORREMOS EL PRIMER NIVEL PARA SACAR LOS PRIMEROS VALORES QUE NO SON ARRAY
foreach($row->check as $check){
// HACEMOS ESTE SEGUNDO LOOP PARA SACAR TODOS LOS VALUES DEL ARRAY CHECK

$horarios = new HorariosNew();
$horarios->hora_inicio = $row->desde;
$horarios->hora_fin = $row->hasta;
$horarios->estado_horario_id = $row->estado_horario_id;
$horarios->cancha_id = $check;
$horarios->save();


}
 
Ahora lo cambio
 
ok gracias
 
<?php

public function store(Request $request){

try {

foreach($request->horario as $id_horario=>$row){
// RECORREMOS EL PRIMER NIVEL PARA SACAR LOS PRIMEROS VALORES QUE NO SON ARRAY
foreach($row['check'] as $check){
// HACEMOS ESTE SEGUNDO LOOP PARA SACAR TODOS LOS VALUES DEL ARRAY CHECK

$horarios = new HorariosNew();
$horarios->hora_inicio = $row['desde'];
$horarios->hora_fin = $row['hasta'];
$horarios->estado_horario_id = $row['estado_horario_id'];
$horarios->cancha_id = $check;
$horarios->save();
En el campo hasta tienes un error
<input type="date" class="form-control" name="horario[$last_horario->id]['hasta']" id="hasta" required="required"/>
Te hacen faltas las llaves
en el name
 
Si me lo salte, ya lo corregi
Undefined index: check
ese error me arroja ahora
en el 2do foreach
 
Estoy viendo la estructura del dd($request->horario)
y esta mal algo.
Espera a ver como decirte que lo arregles
en si
Hay que hacer 3 foreach para acceder a check
y no debe ser asi, con 2 foreach basta
 
3:56 PM
array:2 [▼
5002 => array:3 [▼
"'check'" => array:3 [▼
0 => "2"
1 => "4"
2 => "7"
]
"'desde'" => "2018-11-03"
"'estado_horario_id'" => "2"
]
"$last_horario->id" => array:1 [▼
"'hasta'" => "2018-11-04"
]
]
muestra eso
¿Por qué 3?
 
ah vale, sale diferente ahora
a ver..
joder
no creo que sean por las comilllas simples
XD
quitas las comillas simple del formulario
por ejemplo
horario[{{$last_horario->id}}][check][]
y asi con todos
y corrige las llaves en el name hasta
porque veo que sigue saliendo esto
"$last_horario->id" => array:1 [▼
"'hasta'" => "2018-11-04"
]
 
si lo de las llaves lo corregi en mi
codigo
cambie los nombres
hice el dd($request->horario);
y muestra esto
array:1 [▼
5002 => array:4 [▼
"check" => "6"
"desde" => "2018-11-01"
"hasta" => "2018-11-02"
"estado_horario_id" => "2"
]
]
 
ahora si
upss
has quitado el array en check en el name??
 
lo tengo asi
@foreach($campos as $campos)
<div id="DivCanchas" class="DivCanchas">


<input type="checkbox" data-complejo="{{$campos->complejo_id}}" id="{{$campos->nombre}}" value="{{$campos->id}}" name="horario[{{$last_horario->id}}][check]">
<label id="LabelCanchas" style="color: grey;" for="{{$campos->nombre}}">{{$campos->nombre}}</label>
<br>
</div>
@endforeach
 
uuu
te falta esto
[]
name="horario[{{$last_horario->id}}][check][]"
Sino no podemos guardar mas de un solo id del check
 
4:05 PM
si no me fije xD
array:1 [▼
5002 => array:4 [▼
"check" => array:2 [▼
0 => "5"
1 => "8"
]
"desde" => "2018-11-01"
"hasta" => "2018-11-02"
"estado_horario_id" => "2"
]
]
 
ahora si
prueba ahora
 
lo probe de nuevo
 
quita el dd y haz la prueba
 
otro error :/
Undefined index: sel
lo tengo asi en el controlador
dentro del try
foreach($request->horario as $id_horario=>$row){

// RECORREMOS EL PRIMER NIVEL PARA SACAR LOS PRIMEROS VALORES QUE NO SON ARRAY
foreach($row['check'] as $check){
// HACEMOS ESTE SEGUNDO LOOP PARA SACAR TODOS LOS VALUES DEL ARRAY CHECK

$horarios = new HorariosNew();
$horarios->hora_inicio = $row['desde'].' '.$row['sel'];
$horarios->hora_fin = $row['hasta'].' '.$row['sel2'];
$horarios->estado_horario_id = $row['estado_horario_id'];
$horarios->cancha_id = $check;
$horarios->save();
 
<select name="horarios[{{$last_horario->id}}]['sel']" id="options" required="required" class="option">
<option value="">Seleccione</option>
<option value="08:00:00">08:00:00</option>
<option value="09:00:00">09:00:00</option>
<option value="10:00:00">10:00:00</option>
<option value="11:00:00">11:00:00</option>
<option value="12:00:00">12:00:00</option>
<option value="13:00:00">13:00:00</option>
<option value="14:00:00">14:00:00</option>
<option value="15:00:00">15:00:00</option>
<option value="16:00:00">16:00:00</option>
lo tienes en horarios
o en horario??
 
4:07 PM
quité las comillas
 
y al principio
como lo tienes
horarios?
 
en mi archivo NuevoHorario.blade lo tengo eso
si
asi
 
tiene que ser horario
jeje
como en el resto
asi mismo con el otro sel2
porque estas haciendo esto $request->horario
 
ya esta
agregó los 2 registros nuevos
todo ok
muchas gracias
probe seleccionando 2 checkbox
 
funciono?
bien bien
 
4:11 PM
si funciona
si puedes lo podrias postear como respuesta
puede que le sirva a alguien mas
 
jeje vale
 
me saldré del chat muchas gracias por todo
 
de nada amigo
 

last day (15 days later) »