2017-11-16 23 views
7

Tôi muốn sử dụng các giá trị của thuộc tính trên mối quan hệ của mô hình với Form::labelForm::text. Trình trợ giúp Form đã bị xóa khỏi Laravel, vì vậy tôi sử dụng 'Form' => 'Collective\Html\FormFacade' để thay thế.Làm thế nào để sử dụng giá trị mối quan hệ trong Mặt trận Form Laravel?

Dưới đây là mối quan hệ trong Order mẫu:

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

Và đây là mẫu với Form Blade. Văn bản trong account_number<td> sẽ hiển thị:

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

Nhưng tôi muốn hiển thị đầu vào cho mỗi account_number thuộc tính riêng biệt, không phải là một chuỗi JSON.

Tôi đã thử với:

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

hoặc

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

hoặc

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

... nhưng không ai trong số những công việc. Tất cả họ đều để trống số <td> này.

+0

gì bạn đang tìm kiếm một cái gì đó giống như một hình thức lồng nhau (tôi đoán), nơi bạn có thể chèn một phần của là hình thức trong 1 bảng và một số trong khác) nhưng có vẻ như laravel không hỗ trợ nó trực tiếp, do đó bạn sẽ phải tìm một workaround .. bạn có thể nhìn vào điều này để tham khảo..https: //laravel.io/forum/03- 04-2014-work-around-for-lồng nhau-form –

+0

@DhavalChheda liên kết của bạn là một workarount khác. Tôi muốn sử dụng mối quan hệ với hình dạng mặt tiền ở đây. –

Trả lời

2

Hãy làm điều gì đó chuyên sâu hơn.

Khi tạo phần tử nhập văn bản, FormBuilder sẽ tìm giá trị trong phiên cho giá trị trong dữ liệu đầu vào cũ, sau đó nó sẽ tìm trong trường hợp mô hình nếu được đặt. Nếu không nó sẽ chỉ sử dụng sản phẩm nào.
Trước khi nhận được giá trị thích hợp, nó sẽ chuyển đổi khóa mà chúng tôi đã chỉ định, chẳng hạn như account_number.id, account_number->id, account_number["id"]. Tập trung vào các transformKey chức năng

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

Hãy gọi nó với các phím mà bạn chỉ định từng người một:

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

Sau đó, nó sẽ chia phím bằng cách . trả về một mảng $keys. Và kiểm tra xem có tồn tại mô hình lồng nhau với $keys[0] hay không, nếu không trả lại giá trị của mô hình chính bằng khóa được chuyển đổi. getFormValue()

Dù có tồn tại mô hình lồng nhau hay không, nó sẽ nhận được giá trị thông qua hàm data_get().

Rõ ràng, khóa đầu tiên và thứ hai bạn chỉ định không hoạt động. Cái thứ ba account_number."id", nó sẽ tìm thấy mô hình lồng nhau thành công nhưng nó sẽ không lấy thuộc tính thông qua cách $nestedModel->{"id"}. Sử dụng account_number[id] thay vào đó, nó hoạt động tốt.

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

Để tạo điều khiển đầu vào cho các mối quan hệ của một mô hình bằng cách sử dụng FormBuilder tools cung cấp bởi Laravel Collective, sử dụng cú pháp sau:

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

Lưu ý việc thiếu dấu ngoặc kép quanh id. Ví dụ trong câu hỏi có chứa dấu ngoặc kép xung quanh thuộc tính có liên quan của mô hình id, phá vỡ phép thuật này. Đoạn mã trên làm cho các yếu tố đầu vào sau đây sử dụng giá trị của thuộc tính id trên mối quan hệ Order mô hình của account_number:

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

Định dạng thể hiện trong thuộc tính các yếu tố đầu vào của name phép PHP để phân tích các dữ liệu POST như một mảng. Chúng ta có thể lấy giá trị nộp cho một phương pháp điều khiển như trong ví dụ này:

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

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

Tính năng này rất quan trọng — FormBuilder tạo ra các yếu tố đầu vào được thiết kế để làm việc với nhóm tự động PHP của dữ liệu yêu cầu vào mảng. Nếu chúng tôi gửi nhiều yếu tố đầu vào trên một hình thức cho mối quan hệ của một người mẫu, Laravel làm cho nó dễ dàng để lưu kết quả:

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

Cách bạn đang sử dụng LaravelCollective 's FirmBuilder với mô hình ràng buộc là sai. Giả sử bạn có dữ liệu trong đơn đặt hàng như:

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

Vì vậy, bây giờ nếu bạn muốn hiển thị account_number id trong textfield sau đó bạn có thể viết builder mẫu của bạn theo cách này:

hoặc

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

Nhưng trong câu trả lời thứ hai, bạn sẽ gặp sự cố khi gửi biểu mẫu. Bởi vì ngoài việc nhận được giá trị bạn muốn, dòng mã đó cũng đổi tên giá trị của thuộc tính tên đầu vào thành account_number[id] thay vì account_number. Vì vậy, lựa chọn tốt nhất là sử dụng giải pháp đầu tiên. Đây là liên kết để liên kết mô hình biểu mẫu trong LaravelCollective: https://laravelcollective.com/docs/master/html#form-model-binding

+0

Ở đây bạn sử dụng chỉ định một giá trị mặc định cho đầu vào biểu mẫu. Khi đầu vào không được xác định, giá trị mặc định sẽ được sử dụng. Đặt giá trị mặc định là không cần thiết. –

1

Sau khi cố gắng thực hiện tự môi trường của tôi, conclusion- tôi

{!! 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> 
Các vấn đề liên quan