【问题标题】:Laravel form binding with one to one relationships具有一对一关系的 Laravel 表单绑定
【发布时间】:2014-12-06 20:03:03
【问题描述】:

我有一个与地址模型具有多态关系的帐户模型。这是设置为一对一的关系设置,如下所示:

帐号:

public function address()
{
    return $this->morphOne('Address', 'hasAddress', 'add_hasaddress_type', 'add_hasaddress_id', 'act_id');
}

地址:

public function hasAddress()
{
    return $this->morphTo('hasAddress', 'add_hasaddress_type', 'add_hasaddress_id');
}

在我编辑帐户的表单上,我也有地址字段。我可以通过以下方式简单地绑定我的帐户对象:

{{ Form::model($account, array('route' => array('accounts/edit', $account->act_id), 'method' => 'put')) }}
    {{ Form::label('act_name', 'Account Name:') }}
    {{ Form::text('act_name', Input::old('act_name')) }}

并且正确填写字段。但是,如何填充地址字段?根据我的研究,我需要做:

{{ Form::text('address.add_city', Input::old('address.add_city')) }}

访问关系的值,但这不起作用。

我也试过

{{ Form::text('address[add_city]', Input::old('address[add_city]')) }}

正如标题相似的 SO 所建议的那样。这两个我都试过了,有没有旧的输入。这只是不适用于多态关系还是我做错了什么?

另外,你如何在控制器中处理这些表单?

表单模型绑定文档中没有关于关系的任何内容,进行搜索主要会找到要求一对多绑定的人。

【问题讨论】:

    标签: php laravel-4 eloquent


    【解决方案1】:

    它适用于任何 * 对一的关系(对于多对多,即它不起作用的模型集合):

    // prepare model with related data - eager loading
    $account = Account::with('address')->find($someId);
    
    // or lazy loading
    $account = Account::find($someId);
    $account->load('address');
    
    // view template
    {{ Form::model($account, ...) }}
      Account: {{ Form::text('acc_name') }}
      City: {{ Form::text('address[add_city]') }}
    {{ Form::close() }}
    

    不需要Input::old 或其他任何东西,null 作为默认值就足够了。 Laravel 将按此顺序填充数据(Docs are wrong here!):

    1. old input
    2. bound data
    3. value passed to the helper
    

    请注意,您必须加载关系(动态调用在这种情况下不起作用)。

    另一件事是稍后处理输入 - Laravel 不会自动水合相关模型,因此您需要类似:

    $accountData = Input::only(['acc_name', ... other account fields]);
    // or
    $accountData = Input::except(['address']);
    // validate etc, then:
    $account->fill($accountData);
    
    $addressData = Input::get('address');
    // validate ofc, then:
    $account->address->fill($addressData);
    

    【讨论】:

    • 太棒了。非常感谢。看起来我只是错过了加载相关数据的部分。我没有意识到这是你必须做的事情。
    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2014-01-29
    • 2017-06-20
    • 2021-11-06
    • 2018-06-25
    相关资源
    最近更新 更多