2013-06-01 16 views
23

मैं इस सुविधा के बारे में पढ़ कर दिया गया है: http://laravel.com/docs/html#form-model-bindingLaravel प्रपत्र मॉडल बंधन

और यह वास्तव में साफ दिखता है, लेकिन वहाँ चीजें हैं जो मैं के बारे में कुछ नहीं कर रहा हूँ की जोड़ी है।

क्या मुझे इस फ़ॉर्म को संसाधित करने के लिए नियंत्रक कार्रवाई में कोई कोड डालना होगा? वह किस तरह का दिखता है?

मॉडल (उपयोगकर्ता) मैं अपने रूप में बांधना चाहता हूं, पते के लिए एक अलग तालिका है। इसलिए मैं उपयोगकर्ता मॉडल के फ़ील्ड को भरने में सक्षम होना चाहता हूं, लेकिन संबंधित पता मॉडल के लिए फ़ील्ड भी भरना चाहता हूं। क्या मैं इसे फॉर्म-मॉडल-बाइंडिंग के साथ कर सकता हूं, या क्या मुझे मैन्युअल रूप से फॉर्म को संभालना है?

या, विफल रहा है, क्या मैं उपयोगकर्ता फ़ील्ड के लिए फॉर्म मॉडल बाध्यकारी का उपयोग कर सकता हूं, लेकिन मैन्युअल रूप से पता फ़ील्ड को संभाल सकता हूं?

उत्तर

41

इस फ़ॉर्म को संसाधित करने के लिए आपको अपने नियंत्रक में किसी भी अलग कोड की आवश्यकता नहीं है। आपके सभी (नामित) फॉर्म वैरिएबल इनपुट :: सभी() में होंगे।

मॉडल ($ उपयोगकर्ता) आप

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

में पास बस किसी भी रिकॉर्ड आप के लिए, यदि आप एक से अधिक तालिका शामिल है, तो आप

$user = User::where('id',$userID) 
      ->leftJoin('users_addresses', 'users_addresses.user_id', '=', 'users.id') 
      ->first(); 
की तरह कुछ करना होगा की जरूरत है

और इस रचना मॉडल को अपने फॉर्म :: मॉडल() पर पास करें।

आप अपने इनपुट का नाम कैसे पूरी तरह से ऊपर रखते हैं, क्योंकि आपको अपने फॉर्म को संसाधित करने के लिए तर्क लिखना होगा। लेकिन, मेरी राय में users_address[street] पता इनपुट के लिए अच्छा है, क्योंकि आप अपने उपयोगकर्ता एड्रेस मॉडल पर तुरंत पास कर सकते हैं कि पते कॉलम की एक सरणी के साथ समाप्त हो जाएगा।

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

और अगर आप अपने नियंत्रक में dd(Input::all()) करते हैं, आप कुछ इस तरह मिल जाएगा: https://github.com/raveren/kint:

This is the Input::all() result इस परिणाम Kint के dd() द्वारा प्रदान की जाती है। वास्तव में सहायक

आपके प्रपत्र बस एक ही मॉडल से क्षेत्रों है, तो आपके अद्यतन विधि बहुत सरल हो सकता है और कुछ इस तरह दिखाई कर सकते हैं:

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

रूपों में थोड़ा और अधिक जटिल पर, कोडर के लिए और अधिक तर्क जोड़ना होगा

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

    $inputs = Input::all(); 

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

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

     ... 
    } 

    ... 
} 
+0

बहुत चालाक है कि। तो मैं फ़ील्ड्स के नाम विशेषताओं में संपत्ति नामों को कैसे प्रारूपित करूं? 'Users_address.street' या शायद 'users_address [street]' या किसी अन्य तरीके की तरह? – eimajenthat

+0

इसके अलावा, अगर मैंने उपयोगकर्ता को Auth: user() द्वारा पुनर्प्राप्त किया है तो क्या होगा? क्या मैं ऑथ कर सकता हूं: उपयोगकर्ता() -> leftJoin ('users_addresses', 'users.id', '=', 'users_addresses.user_id')? – eimajenthat

+0

क्या डीडी() उस अच्छे ढहने वाले सरणी दृश्य को उत्पन्न करता है? पहले कभी नहीं देखा। ऐसा लगता है [krumo] (http://krumo.sourceforge.net/), लेकिन संभवतः अच्छा है। किसी भी दर पर, मैंने सोचा कि मॉडल फॉर्म बाध्यकारी ने फ़ील्ड को मॉडल में सहेजने के लिए कुछ जादुई किया है। दस्तावेज़ आपके फॉर्म इनपुट नाम बनाने के बारे में कुछ कहते हैं मॉडल के फ़ील्ड नाम से मेल खाते हैं। शायद यह सिर्फ खेतों को populating के लिए है? लेकिन अगर ऐसा है, तो पता फ़ील्ड को पॉप्युलेट करने के लिए अनुसरण करने के लिए एक मानक है? – eimajenthat

2

Laravel 5.1 में संबंध मॉडल के लिए बाध्यकारी तुम सिर्फ उत्सुक लोड संबंध तालिका (रों) की जरूरत है::

+०१२३५१६४१०६१ उनके नियंत्रकों, आप अनुसंधान का एक छोटा सा अधिक के मामले में मुझे लगता है कि आप ऐसा कर सकते हैं
$user = User::with(['address'])->find($id); 

और दृश्य सेट सरणी के रूप में क्षेत्रों के नाम में:

{!! Form::model($user, ['route' => ['user.update', $user->id]) !!} 
    {!! Form::text('address[street]') !!} 
    {!! Form::text('address[number]') !!} 
{!! Form::close() !!} 
संबंधित मुद्दे