Tengo una sección en la que un usuario puede agregar valores de entrada y puede agregar un campo de entrada tantas veces como quiera. el primer campo de entrada se agrega por defecto al DOM.

El formulario se ve así

enter image description here

Aquí hay HTML para este formulario, supongamos que el usuario agregó un campo de entrada

<dvi class="container h-100">
    <div class="d-flex justify-content-center">
        <div class="card mt-5 col-md-12 animated bounceInDown myForm" id="multiple-container">
            <div class="card-header">
                <h4>Bidders Information</h4>
            </div>
            <div class="card-body" id="add_info">

                <div id="dynamic_container">
                    <small id="bidder">Bidder 1</small>
                    <span class="bmd-form-group"><div class="input-group">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
                </div>
                <input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">
            </div>
            </span>
            <span class="bmd-form-group"><div class="input-group mt-3">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
        </div>
        <input type="text" placeholder="atribute name" name="params_name" id="field1" class="form-control">
        <input type="text" placeholder="atribute value" name="params_value" id="field2" class="form-control">
        <a class="btn btn-secondary btn-sm moreinput_field" id="add_more_input">
            <i class="fa fa-plus-circle"></i>
        </a>
    </div>
    </span>
    </div>

    </div>
    <div class="card-body" id="add_info0">

        <div id="dynamic_container">
            <small id="bidder">Bidder 2</small>
            <span class="bmd-form-group"><div class="input-group">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
        </div>
        <input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">
    </div>
    </span>
    <span class="bmd-form-group"><div class="input-group mt-3">
                            <div class="input-group-prepend">
                              <span class="input-group-text br-15"><i class="fa fa-tags"></i></span>
    </div>
    <input type="text" placeholder="atribute name" name="params_name" id="field1" class="form-control">
    <input type="text" placeholder="atribute value" name="params_value" id="field2" class="form-control">
    <a class="btn btn-secondary btn-sm more_input moreinput_field" id="add_more_input0">
        <i class="fa fa-plus-circle"></i>
    </a>
    </div>
    </span>
    <a class="btn btn-danger btn-sm" id="remove-more"><i class="fa fa-trash"></i></a>
    </div>
    </div>
    <div class="card-footer" id="card-footer">
        <a class="btn btn-success btn-sm" id="add_more"><i class="fa fa-plus-circle"></i> Add<div class="ripple-container"></div></a>

        <button class="btn btn-success btn-sm float-right submit_btn"><i class="fas fa-arrow-alt-circle-right"></i> Submit</button>
    </div>
    </div>
    </div>
</dvi>

En mi controlador, tengo esto.

   public function store(Request $request){

            dd($request);
    }

Que me devuelve lo siguiente

enter image description here

Como puede ver, solo devuelve los segundos campos de entrada

¿Qué tiene de malo mi código?

3
user9964622 18 oct. 2019 a las 16:47

4 respuestas

La mejor respuesta

Tienes que decirle a laravel que es una colección de nombres, por ejemplo, esto:

<input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">

Debería ser así:

<input type="text" placeholder="Bidders Name" name="bidder_name[]" class="form-control">
4
Maraboc 18 oct. 2019 a las 13:50

La razón por la que obtiene solo 1 valor es porque sus atributos HTML tienen el mismo name

<input type="text" placeholder="Bidders Name" name="bidder_name" class="form-control">

En lo anterior, el atributo name es bidder_name, que será el mismo para ambas filas. Entonces solo estás obteniendo la segunda fila.

Puedes cambiarlo como a continuación

<input type="text" placeholder="Bidders Name" name="bidder_name[]" class="form-control">

Es necesario realizar los mismos cambios para otros 2 elementos de formulario HTML.

3
ascsoftw 18 oct. 2019 a las 13:52

Una sugerencia más, también puede definir la identificación del licitador dentro de la matriz, como:

name="bidder_name[b1]" o simplemente name="bidder_name[1]"

Esto lo ayudará a comprender qué índice se relaciona con el oferente en el que tiene un oferente múltiple.

Ejemplo:

<input type="text" placeholder="Bidders Name" name="bidder_name[b1]" class="form-control">

O

<input type="text" placeholder="Bidders Name" name="bidder_name[1]" class="form-control">
1
devpro 18 oct. 2019 a las 14:08

Esto no tiene nada que ver específicamente con laravel, así es como funcionan las solicitudes HTTP. Las dos entradas tienen el mismo parámetro name, por lo que la segunda sobrescribe la primera.

Si desea múltiples valores en la misma variable, úselo como una tabla agregando corchetes.

<input type="text" placeholder="Bidders Name" name="variable_name[]" class="form-control">
1
N69S 18 oct. 2019 a las 13:53