使用laravel,如何创建更新一对多关系的视图?

使用laravel,如何创建更新一对多关系的视图?,laravel,laravel-4,eloquent,blade,Laravel,Laravel 4,Eloquent,Blade,我有两个型号,联系人和电子邮件。任何联系人都可能有多个电子邮件地址,因此我在模型中创建了一对多关系: class Contact extends Eloquent { protected $guarded = array(); public static $rules = array( 'first_name' => 'required', 'last_name' => 'required' ); public f

我有两个型号,联系人和电子邮件。任何联系人都可能有多个电子邮件地址,因此我在模型中创建了一对多关系:

class Contact extends Eloquent {

    protected $guarded = array();

    public static $rules = array(
        'first_name' => 'required',
        'last_name' => 'required'
    );

    public function emails() {
        return $this->hasMany('Email');
    }

}

class Email extends Eloquent {

    public function emails() {
        return $this->belongsTo('Contact');
    }

}
希望到目前为止我在正确的轨道上

我使用Jeff Way的脚手架作为接触模型,因此我在控制器中使用了以下更新方法:

public function update($id)
{
    $input = array_except(Input::all(), '_method');
    $validation = Validator::make($input, Contact::$rules);

    if ($validation->passes())
    {
        $contact = $this->contact->find($id);
        $contact->update($input);

        return Redirect::route('contacts.show', $id);
    }

    return Redirect::route('contacts.edit', $id)
        ->withInput()
        ->withErrors($validation)
        ->with('message', 'There were validation errors.');
}
此外,我还修改了“编辑”视图以显示与联系人相关的所有电子邮件,然后添加一个额外的空白输入以添加新的电子邮件:

@foreach($emails as $key => $email)
    <li>
        {{ Form::label('email', 'Email '.$key.':') }}
        {{ Form::text('email'.$email->id, $email->email) }}
    </li>
    @if(count($emails)==$key+1)
    <li>
        {{ Form::label('email', 'Email '.($key+1).':') }}
        {{ Form::text('email'.($email->id+1)) }}
    </li>
    @endif
@endforeach
@foreach($key=>$email形式的电子邮件)
  • {{Form::label('email','email'.$key.:')} {{Form::text('email'.$email->id,$email->email)}
  • @如果(计数($email)=$key+1)
  • {{Form::label('email','email'($key+1)。':')} {{Form::text('email')($email->id+1))}
  • @恩迪夫 @endforeach

    现在,我不知道如何修改更新方法来更新电子邮件(如果修改)并添加新的电子邮件(如果输入)。如果有人能给我指出正确的方向,我将不胜感激——谢谢

    这个问题的答案不一定是拉威尔特有的答案

    不管怎样,您都需要处理将联系人的电子邮件与表单中提交的内容同步:

    两种策略:

  • 删除与联系人关联的所有电子邮件。然后根据表单中的内容创建新电子邮件。这样,你总是插入新的电子邮件
  • 获取与联系人相关的所有电子邮件。反复浏览它们。如果提交的电子邮件(来自表单)的ID与现有电子邮件匹配,请更新该电子邮件地址。如果电子邮件是新的(没有与之关联的ID),请创建一个新的。这个选项可能需要一个嵌套的循环,从技术上讲应该是不受欢迎的——然而,对于少量的电子邮件来说,这并不是什么大问题
  • 现在,要获得特定于Laravel(4)的

    Eloquent有一个方便的
    sync()
    方法来处理更新关系-但是,我相信它只适用于多对多关系,因此依赖于“透视表”

    Eloquent还有一个
    push()
    方法,但由于我还没有使用它,我不确定它是在幕后“同步”相关电子邮件,还是只是添加新的关系。这是你最好的选择

    我在推特上向Laravel询问,希望看到答案sonn:

    对于选项1:

    首先,将所有电子邮件文本字段(无论是现有的还是新的)重命名为
    email[]
    。我们不关心他们的ID,因为他们正在被删除

    @foreach($emails as $key => $email)
        <li>
            {{ Form::label('email', 'Email:') }}
            {{ Form::text('email[]', $email->email) }}
        </li>
    @endforeach
        <!-- No need to have this in PHP logic - always give option to add new emails -->
        <!-- I'm also assuming you can name multiple new emails, perhaps with some JS -->
        <li>
            {{ Form::label('email', 'New Email:') }}
            {{ Form::text('email[]' }}
        </li>
    
    对于选项2:

    您将知道是否存在新电子邮件,因为它们没有与表单数据关联的ID。我会将我的输入更改为一系列电子邮件,以便更轻松地循环浏览:

    @foreach($emails as $key => $email)
        <li>
            {{ Form::label('email', 'Email '.$key.':') }}
            <!-- Notice this is an array now: -->
            {{ Form::text('email['.$email->id.']', $email->email) }}
        </li>
    @endforeach
        <!-- No need to have this in PHP logic - always give option to add new emails -->
        <!-- I'm also assuming you can name multiple new emails, perhaps with some JS -->
        <li>
            {{ Form::label('newemail', 'New Email:') }}
            {{ Form::text('newemail[]' }}
        </li>
    
    对于“非新”电子邮件,
    Input::get('email')
    在我上面的示例中,您可能需要获取与联系人相关联的当前电子邮件(
    $currentmails=$contact->emails()
    ),并根据需要在foreach循环中更新它们(此处未写入)


    类似的东西应该会让你开始…

    你可以使用
    push()
    方法来保存模型和关系谢谢,这可能是正确的方向,我不确定-但我肯定需要更多的帮助。如何让它更新电子邮件表中的相应行,并在不存在的情况下添加一行?
    @foreach($emails as $key => $email)
        <li>
            {{ Form::label('email', 'Email '.$key.':') }}
            <!-- Notice this is an array now: -->
            {{ Form::text('email['.$email->id.']', $email->email) }}
        </li>
    @endforeach
        <!-- No need to have this in PHP logic - always give option to add new emails -->
        <!-- I'm also assuming you can name multiple new emails, perhaps with some JS -->
        <li>
            {{ Form::label('newemail', 'New Email:') }}
            {{ Form::text('newemail[]' }}
        </li>
    
    foreach( Input::get('newemail') as $email)
    {
        $newEmail = new Email();
        $newEmail->email = $email;
        $contact->emails()->save( $newEmail );
    }