【问题标题】:How to use relationship value in Laravel Form Facade?如何在 Laravel Form Facade 中使用关系值?
【发布时间】:2018-04-29 11:11:14
【问题描述】:

我想在模型与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 &lt;td&gt; 中的文本将显示:

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

...但是这些都不起作用。他们都把这个&lt;td&gt;留空。

【问题讨论】:

  • 您正在寻找的类似于嵌套表单(我猜),您可以在其中将表单的一部分插入到 1 个表中,而在其他表中插入一些)但似乎 laravel 不直接支持它所以您将不得不寻找解决方法..您可以查看此以供参考..laravel.io/forum/03-04-2014-work-around-for-nested-forms
  • @DhavalChheda 您的链接是另一种解决方法。我想在这里使用与表单外观的关系。

标签: php forms laravel laravel-5 laravel-eloquent


【解决方案1】:

尝试在我自己的环境上实现后,我的结论-

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

【讨论】:

    【解决方案2】:

    您使用 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
    }
    }
    

    所以现在如果您想在文本字段中显示 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

    【讨论】:

    • 这里你使用为表单输入指定一个默认值。当输入未定义时,将使用默认值。不需要设置默认值。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      在生成文本输入元素时,FormBuilder 将在会话中查找旧输入数据中的值,然后在模型实例中查找(如果已设置)。否则它只会使用空。
      在它得到合适的值之前,它会转换我们指定的键,例如account_number.idaccount_number-&gt;idaccount_number["id"]。关注transformKey函数

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

      让我们用你指定的键一一调用:

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

      然后它将通过. 拆分密钥,返回一个数组$keys。并检查是否存在带有$keys[0] 的嵌套模型,否则返回带有转换键的主模型的值。 getFormValue()

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

      显然,您指定的第一个键和第二个键不起作用。第三个account_number."id",它会成功找到嵌套模型,但不会通过$nestedModel-&gt;{"id"}的方式检索属性。改用account_number[id],效果很好。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多