2017-11-16 107 views
7

Chcę użyć wartości atrybutów na relacji modelu z Form::label i Form::text. Pomocnik Form został usunięty z Laravel, więc używam zamiast niego 'Form' => 'Collective\Html\FormFacade'.Jak wykorzystać wartość relacji w elewacji formy Laravel?

Oto relacja w Order Model:

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

A oto szablon Blade z Form. Tekst w account_number<td> pokaże:

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

Ale chcę pokazać wejść do każdego account_number atrybutów osobno, a nie jako ciąg JSON.

Próbowałem z:

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

lub

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

lub

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

... ale żaden z tych prac. Wszystkie one zostawiają puste. <td>.

+0

Co szukasz jest coś takiego jak zagnieżdżonego postaci (chyba), gdzie można wstawić część Formularz w 1 tabeli, a niektóre w innych), ale wydaje się, że laravel nie obsługuje go bezpośrednio, więc będziesz musiał szukać obejścia. Możesz spojrzeć na to dla odniesienia..https: //laravel.io/forum/03- 04-2014-work-around-for-nested-forms –

+0

@DhavalChheda twoje linki to kolejne workarount. Chcę użyć relacji z fasadą formy tutaj. –

Odpowiedz

2

Zróbmy coś bardziej dogłębnego zrozumienia.

Podczas generowania elementu wprowadzania tekstu, FormBuilder będzie szukał wartości w sesji dla wartości w starych danych wejściowych, a następnie będzie wyglądać w instancji modelu, jeśli jest ustawiony. W przeciwnym razie po prostu użyje pustego.
Zanim otrzyma odpowiednią wartość, przekształci klucz, który wymieniliśmy, na przykład account_number.id, account_number->id, . Skupić się na transformKey funkcji

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

Nazwijmy go z klawiszy określonych jeden po drugim:

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

Następnie podzieli klucz przez . zwróć tablicę $keys. Sprawdź, czy istnieje model zagnieżdżony z $keys[0], w przeciwnym razie zwróć wartość modelu głównego ze zmienionym kluczem. getFormValue()

Bez względu na to, czy istnieje model zagnieżdżony, czy nie, otrzyma wartość poprzez funkcję data_get().

Oczywiście pierwszy i drugi podany klucz nie działa. Trzeci: account_number."id", z powodzeniem odnajdzie model zagnieżdżony, ale nie odzyska atrybutu po drodze: $nestedModel->{"id"}. Użyj zamiast tego, account_number[id], działa dobrze.

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

Aby utworzyć formantów wejściowych do modelu relacji Korzystanie z FormBuilder tools dostarczonych przez Laravel Collective, należy użyć następującej składni:

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

Uwaga braku cudzysłowie id. Przykład w pytaniu zawiera cytaty dotyczące atrybutu związanego z nim modelu id, który przerywa tę magię. powyżej kod świadczy następujący element wejściowy wykorzystując wartość atrybutu id na account_number stosunków Order modelu:

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

format przedstawiony w atrybucie elementu wejściowego name umożliwia PHP do analizowania danych post jako macierzy. Możemy sprowadzić wartość przekazany do metody kontrolera jak w poniższym przykładzie:

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

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

Ta cecha jest ważna — FormBuilder generuje elementy napędowe przeznaczone do pracy z automatycznego grupowania danych PHP żądanie do tablic. Jeśli mamy złożyć wiele elementów wejściowych na formularzu dla relacji modelu, w laravel ułatwia zapisać wynik:

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

Sposób używasz LaravelCollective „s FirmBuilder z modelu wiązania jest źle. Załóżmy masz dane zleceń, takich jak:

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

Więc teraz, jeśli chcesz wyświetlić ACCOUNT_NUMBER id w polu tekstowym, a następnie można napisać swoją postać konstruktora w ten sposób:

lub

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

Ale w drugiej odpowiedzi otrzymasz błąd przy przesyłaniu formularza. Ponieważ oprócz uzyskania żądanej wartości ten wiersz kodu zmienia także nazwę atrybutu nazwy wejścia na account_number[id] zamiast account_number. Najlepszym rozwiązaniem jest użycie pierwszego rozwiązania. Oto link do wiązania modelu formularza w LaravelCollective: https://laravelcollective.com/docs/master/html#form-model-binding

+0

Tutaj należy podać wartość domyślną dla wprowadzania formularza. Gdy wejście nie zostanie zdefiniowane, zostanie użyta wartość domyślna. Ustaw domyślną wartość nie jest konieczne. –

1

Po próbując wdrożyć na własnym środowiska, mój 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>