繁体   English   中英

如何在Laravel Form Facade中使用关系值?

[英]How to use relationship value in Laravel Form Facade?

我想在模型与Form::labelForm::text的关系中使用属性值。 Form助手已从Laravel中删除,因此我使用'Form' => 'Collective\\Html\\FormFacade'代替。

以下是Order模型中的关系:

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

这是带有Form的Blade模板。 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>留空了。

要使用Laravel Collective提供的FormBuilder工具为模型的关系创建输入控件,请使用以下语法:

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

请注意id周围缺少引号。 问题中的示例包含相关模型的id属性的引号,这打破了这种魔力。 上面的代码使用Order模型的account_number关系中的id属性的值呈现以下输入元素:

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

input元素的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();
}

让我们做一些更深入的了解。

在生成文本输入元素时, FormBuilder将在会话中查找旧输入数据中的值,然后如果设置了一个,它将在模型实例中查找。 否则它只会使用空。
在获得适当的值之前,它将转换我们指定的密钥,例如account_number.idaccount_number->idaccount_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]检查是否存在嵌套模型,否则返回带有转换键的主模型的值。 getFormValue()

无论它是否存在嵌套模型,它都将通过data_get()函数获取值。

显然,您指定的第一个键和第二个键不起作用。 第三个是account_number."id" ,它会成功找到嵌套模型但它不会通过$nestedModel->{"id"}的方式检索属性。 使用account_number[id]代替,它运作良好。

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

你使用LaravelCollective的FirmBuilder与模型绑定的方式是错误的。 假设您有以下订单中的数据:

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

所以现在如果你想在textfield中显示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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM