2017-11-16 3 views
7

Ich möchte die Werte von Attributen in der Beziehung eines Modells mit Form::label und Form::text verwenden. Der Form Helfer wurde aus Laravel entfernt, also verwende ich 'Form' => 'Collective\Html\FormFacade' statt. HierWie wird der Beziehungswert in Laravel Form Facade verwendet?

ist die Beziehung in dem Order Modell:

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\SoftDeletes; 

class Order extends \Eloquent 
{ 
    use SoftDeletes; 

    public function account_number() 
    { 
     return $this->belongsTo('\App\Models\Account_number', 'product_id', 'id'); 
    } 
} 

Und hier ist die Blade-Vorlage mit Form. Der Text in der account_number<td> zeigt:

{"id":4,"user_id":52,"account_type":"alipay","account_no":"xxxxxx","account_name":"xxxxxx","phone":"xxxxxx","created_at":"2017-11-15 14:43:51","updated_at":"2017-11-15 14:43:51","deleted_at":null} 
{!! Form::model($order, array('files' => true)) !!} 
<table border="1"> 
<tr> 
    <td>{!! Form::label('out_trade_no', 'out_trade_no: ') !!}</td> 
    <td>{!! Form::text('out_trade_no')!!}</td> 
</tr> 
<tr> 
    <td>{!! Form::label('account_number', 'account_number: ') !!}</td> 
    <td>{!! Form::text('account_number')!!}</td> 
</tr> 
</table> 

Aber ich möchte Eingänge zeigen für jede account_number separat Attribut, nicht als JSON-String.

Ich habe versucht, mit:

<tr> 
    <td>{!! Form::label('account_number.id', 'account_number: ') !!}</td> 
    <td>{!! Form::text('account_number.id')!!}</td> 
</tr> 

oder

<tr> 
    <td>{!! Form::label('account_number->id', 'account_number: ') !!}</td> 
    <td>{!! Form::text('account_number->id')!!}</td> 
</tr> 

oder

<tr> 
    <td>{!! Form::label('account_number', 'account_number: ') !!}</td> 
    <td>{!! Form::text('account_number["id"]')!!}</td> 
</tr> 

... aber keines dieser Arbeit. Sie alle lassen diese <td> leer.

+0

zu implementieren (ich glaube), wo man einen Teil des Einsatzes kann Form in 1 Tabelle und einige in anderen), aber es scheint, Laravel unterstützt es nicht direkt, so dass Sie nach einer Workaround suchen müssen .. Sie können sich dies für Referenz suchen .. http://laravel.io/forum/03- 04-2014-Work-Around-for-Nested-Formulare –

+0

@DhavalCheda Ihre Links ist ein weiterer Workaround. Ich möchte hier die Beziehung zur Formfassade nutzen. –

Antwort

2

Lassen Sie uns etwas tiefergehendes Verständnis tun.

Beim Generieren eines Texteingabeelements wird FormBuilder nach dem Wert in der Sitzung für den Wert in den alten Eingabedaten suchen und dann in der Modellinstanz suchen, wenn eine festgelegt ist. Ansonsten wird es nur leer verwendet.
Bevor der entsprechende Wert abgerufen wird, wird der von uns angegebene Schlüssel wie account_number.id, account_number->id, account_number["id"] umgewandelt. Konzentrieren Sie sich auf die transformKey Funktion

protected function transformKey($key) 
{ 
    return str_replace(['.', '[]', '[', ']'], ['_', '', '.', ''], $key); 
} 

Nennen wir es mit den Tasten, die Sie nacheinander angegeben:

  1. account_number.id =>account_number_id
  2. account_number->id =>account_number->id
  3. account_number["id"] =>account_number."id"

Dann teilt es den Schlüssel durch . geben Sie ein Array $keys zurück. Überprüfen Sie, ob ein verschachteltes Modell mit $keys[0] existiert, andernfalls geben Sie den Wert des Master-Modells mit dem transformierten Schlüssel zurück. getFormValue()

Egal, ob es geschachteltes Modell existiert oder nicht, es wird den Wert durch data_get() Funktion erhalten.

Offensichtlich funktioniert der erste Schlüssel und die zweite, die Sie angegeben haben, nicht. Die dritte account_number."id", es wird das verschachtelte Modell erfolgreich finden, aber es wird nicht das Attribut über den Weg $nestedModel->{"id"} abrufen. Verwenden Sie stattdessen account_number[id], es funktioniert gut. Was Sie suchen ist so etwas wie eine verschachtelte Form

<td>{!! Form::text('account_number[id]')!!}</td> 
3

Um Eingabesteuerungen für ein Modell der Beziehungen zu schaffen, die durch Laravel CollectiveFormBuilder tools bereitgestellt, verwenden Sie die folgende Syntax:

{!! Form::model($order, ...) !!} 
    ... 
    {!! Form::label('account_number[id]', 'account number: ') !!} 
    {!! Form::text('account_number[id]') !!} 
    ... 
{!! Form::close() !!} 

Hinweis das Fehlen von Anführungszeichen um id. Das Beispiel in der Frage enthält Anführungszeichen um das Attribut id des verwandten Modells, das diese Magie bricht. Der obige Code macht die folgenden Eingabeelement mit dem Wert des id Attribut für das account_number Beziehung des Order Modell:

<input name="account_number[id]" type="text" value="4"> 

das Format in der PHP die POST-Daten als Array parsen ermöglicht name Attributelementeingang gezeigt ist. Wir können den Wert an eine Steuereinheit abgegeben Verfahren holen wie in diesem Beispiel:

public function save(Request $request) 
{ 
    $accountNumber = $request->get('account_number'); 

    echo $accountNumber['id']; // '4' 
    ... 
} 

Dieses Merkmal ist wichtig — FormBuilder Eingabeelemente ausgelegt erzeugt mit PHP automatischer Gruppierung der Anforderungsdaten in Arrays zu arbeiten. Wenn wir mehrere Eingabeelemente auf einem Formular für eine Beziehung des Modells vorlegen, macht Laravel es einfach, das Ergebnis zu speichern:

public function update(Request $request, $orderId) 
{ 
    Order::with('account_number')->find($orderId) 
     ->fill($request->all()) 
     ->account_number->fill($request->account_number) 
     ->push(); 
} 
1

Die Art und Weise Sie verwenden LaravelCollective ‚s FirmBuilder mit Modell Bindung falsch ist. Nehmen wir an, Sie haben Daten in Befehle wie:

{ 
id: 1, 
....., // some other fields 
account_number: { 
"id":4, 
"user_id":52, 
"account_type":"alipay", 
"account_no":"xxxxxx", 
"account_name":"xxxxxx", 
"phone":"xxxxxx", 
"created_at":"2017-11-15 14:43:51", 
"updated_at":"2017-11-15 14:43:51", 
"deleted_at":null 
} 
} 

So, jetzt, wenn Sie account_number id in Textfeld angezeigt werden soll, dann können Sie Ihr Formular-Builder auf diese Weise schreiben:

oder

<td>{!! Form::text('account_number[id]') !!}</td> 

Aber in der zweiten Antwort erhalten Sie Problem beim Einreichen des Formulars. Da diese Codezeile neben dem gewünschten Wert auch den Wert des Attributs für die Eingabe-Namensattribute in account_number[id] statt in account_number umwandelt. Die beste Lösung ist die erste Lösung. Hier ist der Link für Formular-Modell-Bindung in LaravelCollective: https://laravelcollective.com/docs/master/html#form-model-binding

+0

Hier geben Sie einen Standardwert für die Formulareingabe an. Wenn die Eingabe nicht definiert ist, wird der Standardwert verwendet. Stellen Sie den Standardwert ist nicht erforderlich. –

1

Nach dem Versuch, auf meine eigene Umgebung, mein conclusion-

{!! Form::model($order, array('files' => true)) !!} 
<table border="1"> 
    <tr> 
    <td>{!! Form::label('out_trade_no', 'out_trade_no: ') !!}</td> 
    <td>{!! Form::text('out_trade_no')!!}</td> 
    </tr> 
    <tr> 
    <td>{!! Form::label('account_number', 'account_number: ') !!}</td> 
    <td>{!! Form::text('account_number[id]')!!}</td> 
    </tr> 
</table> 
Verwandte Themen