web-dev-qa-db-fra.com

Laravel liaison de modèle de formulaire

J'ai lu sur cette fonctionnalité: http://laravel.com/docs/html#form-model-binding

Et ça a l'air vraiment bien, mais il y a quelques choses dont je ne suis pas certain.

Dois-je mettre du code dans l'action du contrôleur pour traiter ce formulaire? A quoi cela ressemble-t-il?

Le modèle (utilisateur) que je veux lier dans mon formulaire a une table distincte pour les adresses. Je veux donc pouvoir remplir les champs du modèle utilisateur, mais aussi les champs du modèle d'adresse associé. Puis-je le faire avec form-model-binding, ou dois-je gérer le formulaire manuellement?

Ou, à défaut, puis-je utiliser la liaison de modèle de formulaire pour les champs utilisateur, mais gérer manuellement les champs d'adresse?

25
eimajenthat

Vous n'avez pas besoin de code différent dans votre contrôleur pour traiter ce formulaire. Toutes vos variables de formulaire (nommées) seront dans Input :: all ().

Le modèle ($ user) que vous transmettez

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

Est-ce que n'importe quel enregistrement dont vous avez besoin, si vous avez plus d'une table impliquée, vous devrez faire quelque chose comme

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

Et passez ce modèle composé à votre Form :: model ().

La façon dont vous nommez vos entrées dépend entièrement de vous, car vous devrez écrire la logique pour traiter votre formulaire. Mais, à mon avis, users_address[street] Pour les entrées d'adresse est bon, car vous vous retrouverez avec un tableau de colonnes d'adresses que vous pouvez transmettre immédiatement à votre modèle UserAddress.

<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>

Et si vous faites dd( Input::all() ) dans votre contrôleur, vous obtiendrez quelque chose comme ceci:

This is the Input::all() result Ce résultat est fourni par dd () de Kint: https://github.com/raveren/kint . Très utile.

Si votre formulaire ne contient que des champs d'un seul modèle, votre méthode de mise à jour peut être très simple et ressembler à quelque chose comme:

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.');
}

Sur les formulaires un peu plus complexes, les codeurs devront ajouter plus de logique à leurs contrôleurs, dans votre cas avec un peu plus de recherche, je pense que vous pouvez y arriver:

public function update($id)
{
    $user = User::find($id);

    $inputs = Input::all();

    if (!$user->update($inputs)) {
            $address = new UserAddress($inputs['address']);

        $user->address()->save($address);

        ...
    }

    ...
}
43

Dans Laravel 5.1 pour la liaison de modèle de relation, vous avez juste besoin de charger les tables de relation:

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

Et dans la vue, définissez les noms de champs sous forme de tableau:

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