Как использовать значение отношения в фасаде формы Laravel?

я хочу использовать значения атрибутов в отношениях модели с Form::label и Form::text. The Form помощник был удален из Laravel, поэтому я использую .

вот отношения в Order модель:

<?php namespace AppModels;

use IlluminateDatabaseEloquentSoftDeletes;

class Order extends Eloquent
{
    use SoftDeletes;

    public function account_number()
    {
        return $this->belongsTo('AppModelsAccount_number', 'product_id', 'id');
    }
}

и вот шаблон лезвия с Form. Текст в account_number <td> появится сообщение:

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

но я хочу показать входные данные для каждого account_number атрибут отдельно, а не как JSON строка.

я пробовал с:

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

или

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

или

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

...но ничего из этого не работает. Они все оставляют это <td> пустой.

4 ответов


давайте сделаем что-то более глубокое понимание.

при создании текстового элемента input, FormBuilder будет искать значение в сеансе для значения в старых входных данных, тогда он будет выглядеть в экземпляре модели, если он установлен. Иначе это будет просто пустой.
Прежде чем он получит соответствующее значение, он преобразует ключ, который мы указали, например account_number.id, account_number->id, account_number["id"]. Сосредоточьтесь на transformKey функция

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

назовем его с ключами вы указали по одному:

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

тогда он разделит ключ на . возвращает массив $keys. И проверьте, существует ли вложенная модель с $keys[0], в противном случае возвращает значение master model с преобразованным ключом. getFormValue ()

нет дело в том, что существует вложенная модель или нет, она получит значение через data_get().

очевидно, что первый ключ и второй, который вы указали, не работают. Третий account_number."id", он найдет вложенную модель успешно, но он не будет извлекать атрибут через путь $nestedModel->{"id"}. Использовать account_number[id] вместо этого, он работает хорошо.

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

для создания входных элементов управления для отношений модели с помощью FormBuilder инструменты предоставлен Laravel Collective используйте следующий синтаксис:

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

обратите внимание на отсутствие кавычек вокруг id. Пример в вопросе содержит кавычки вокруг связанной модели id атрибут, который нарушает эту магию. Приведенный выше код отображает следующий элемент ввода, используя значение на Order модели account_number отношения:

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

формат, показанный в элементе ввода name атрибут позволяет PHP анализировать данные POST как массив. Мы можем получить значение, представленное методу контроллера, как в этом примере:

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

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

эта функция важна-FormBuilder генерирует входные элементы, предназначенные для работы с автоматической группировкой данных запроса PHP в массивы. Если мы отправляем несколько входных элементов в форму для отношения модели, Laravel делает это легко сохранить результат:

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

как вы используете LaravelCollectiveFirmBuilder с привязкой модели ошибочен. Предположим, у вас есть данные в таких порядках, как:

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

Итак, теперь, если вы хотите отобразить account_number id в текстовом поле вы можете написать свой конструктор форм следующим образом:

{!! Form::model($order, ...) !!} 
    ...
    <tr>
    <td>{!! Form::label('account_number', 'account number: ') !!}</td>
    <td>{!! Form::text('account_number', $order->account_number->id) !!}</td>
    </tr>
    ...
{!! Form::close() !!}

или

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

но во втором ответе вы получите вопрос при отправке формы. Потому что, помимо получения значения, которое вы хотели, эта строка кода также переименовывает ваш введите значение атрибутов имени в account_number[id] вместо account_number. Поэтому лучше всего использовать первое решение. Вот ссылка для привязки модели формы в LaravelCollective:https://laravelcollective.com/docs/master/html#form-model-binding


после попытки реализовать самостоятельно окружающая среда мой вывод-

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