He estado leyendo acerca de esta característica: http://laravel.com/docs/html#form-model-binding

Y se ve realmente bueno, pero hay un par de cosas que no estoy seguro acerca de.

Necesito para poner el código en el controlador de acción para el proceso de esta forma? ¿Qué aspecto tiene esto?

El modelo (Usuario) quiero enlazar en mi formulario tiene una tabla separada para las direcciones. Por lo tanto, quiero ser capaz de llenar el modelo de Usuario de los campos, pero también los campos para la Dirección del modelo. Puedo hacer eso con el formulario-modelo de unión, o tengo que manejar el formulario manualmente?

O, en su defecto, puedo utilizar el formulario modelo de enlace para que el usuario los campos, pero manejar manualmente los campos de dirección?

InformationsquelleAutor eimajenthat | 2013-06-01

2 Comentarios

  1. 44

    Usted no necesita ningún código diferente en su controlador de proceso de este formulario. Todos sus (nombre) variables de formulario será en la Entrada::all().

    El modelo ($usuario) se pasa en

    Form::model($user, array('route' => array('user.update', $user->id)))

    Es cualquier registro que usted necesita, si usted tiene más de una tabla involucrados, tendrás que hacer algo como

    $user = User::where('id',$userID)
               ->leftJoin('users_addresses', 'users_addresses.user_id', '=', 'users.id')
               ->first();

    Y pasar esta compuesto modelo de Formulario::model().

    Del nombre de las entradas es totalmente de usted, porque usted tiene que escribir la lógica para procesar el formulario. Pero, en mi opinión users_address[street] para la dirección de las entradas es bueno, porque usted va a terminar con una matriz de direcciones de columnas que puede pasar de inmediato a su UserAddress modelo.

    <html>
        <head>
            <title></title>
        </head>
        <body>
            {{ Form::model($user, array('route' => array('user.update', $user->id))) }}
                {{ Form::label('first_name', 'First Name:', array('class' => 'address')) }}
                {{ Form::text('first_name') }}
    
                {{ Form::label('last_name', 'Last Name:', array('class' => 'address')) }}
                {{ Form::text('last_name') }}
    
                {{ Form::label('email', 'E-Mail Address', array('class' => 'address')) }}
                {{ Form::text('email') }}
    
                {{ Form::label('address[street1]', 'Address (Street 1)', array('class' => 'address')) }}
                {{ Form::text('address[street1]') }}
    
                {{ Form::label('address[street2]', 'Address (Street 2)', array('class' => 'address')) }}
                {{ Form::text('address[street2]') }}
    
                {{ Form::label('ddress[city]', 'City', array('class' => 'address')) }}
                {{ Form::text('address[city]') }}
    
                {{ Form::label('address[state]', 'State', array('class' => 'address')) }}
                {{ Form::text('address[state]') }}
    
                {{ Form::label('address[zip]', 'Zip Code', array('class' => 'address')) }}
                {{ Form::text('address[zip]') }}
    
                {{ Form::submit('Send this form!') }}
            {{ Form::close() }}
        </body>
    </html>

    Y si no dd( Input::all() ) en el controlador, obtendrás algo como esto:

    Laravel formulario modelo de enlace
    Este resultado es proporcionada por Kint dd(): https://github.com/raveren/kint. Realmente útil.

    Si el formulario sólo tienen campos a partir de un único Modelo, el método de actualización puede ser muy sencillo y parecido a:

    public function update($id)
    {
        $user = User::find($id);
    
        if (!$user->update(Input::all())) {
            return Redirect::back()
                    ->with('message', 'Something wrong happened while saving your model')
                    ->withInput();
        }
    
        return Redirect::route('user.saved')
                    ->with('message', 'User updated.');
    }

    En forma un poco más compleja, los codificadores deben añadir más lógica para sus controladores, en su caso, con un poco más de investigación, creo que usted puede hacer que esto suceda:

    public function update($id)
    {
        $user = User::find($id);
    
        $inputs = Input::all();
    
        if (!$user->update($inputs)) {
                $address = new UserAddress($inputs['address']);
    
            $user->address()->save($address);
    
            ...
        }
    
        ...
    }
    • Eso es bastante ingenioso. Entonces, ¿cómo puedo cambiar el formato de los nombres de las propiedades de los campos’ nombre de los atributos? Como users_address.street o tal vez users_address[street] o de alguna otra manera?
    • También, lo que si puedo recuperar el usuario por Auth:user()? Podría yo hacer Auth:user()->leftJoin(‘users_addresses’, ‘los usuarios.id’, ‘=’, ‘users_addresses.user_id’)?
    • No dd() generar que bonito plegable de la matriz de punto de vista? No la había visto nunca antes. Parece krumo, pero posiblemente sea más agradable. En cualquier caso, pensé que el modelo de formulario de unión hizo algo mágico alrededor de ahorro de los campos a la modelo. Los médicos dicen algo acerca de cómo hacer su formulario de entrada de nombres coinciden con el modelo de los nombres de campo. Tal vez eso es sólo para rellenar los campos? Pero si ese es el caso, hay un estándar a seguir para obtener la dirección de los campos a rellenar?
    • dd() es de Kint paquete, publicó un enlace de arriba. Y el formulario modelo es de alguna manera mágica, que yo sepa, de formas simples. Acaba de agregar un ejemplo. Usted necesidad justa de $user->update(Input::all()) para guardar el formulario.
    • Auth:user() ya es un modelo, no estoy seguro de si se puede hacer una nueva consulta sobre él, pero en Laravel con todas las inyecciones, todo es posible. Pero usted puede simplemente añadir una nueva propiedad a su modelo de Usuario y llamar las cosas como $usuario->user_with_address, que hará lo que usted necesita para obtener su usuario con su dirección.
    • ¿Por qué me sale Undefined property: Iluminar la Base de datos\\Elocuente\Builder::$id

  2. 2

    En Laravel 5.1 para la relación modelo de enlace sólo necesitas ganas de carga de relación de la tabla(s):

    $user = User::with(['address'])->find($id);

    Y en vista de conjunto de nombres de campos como la matriz:

    {!! Form::model($user, ['route' => ['user.update', $user->id]]) !!}
        {!! Form::text('address[street]') !!}
        {!! Form::text('address[number]') !!}
    {!! Form::close() !!}

Dejar respuesta

Please enter your comment!
Please enter your name here