Как использовать значение отношения в фасаде формы 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);
}
назовем его с ключами вы указали по одному:
-
account_number.id
=>account_number_id
-
account_number->id
=>account_number->id
-
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>