使用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
现在,我不知道如何修改更新方法来更新电子邮件(如果修改)并添加新的电子邮件(如果输入)。如果有人能给我指出正确的方向,我将不胜感激——谢谢 这个问题的答案不一定是拉威尔特有的答案 不管怎样,您都需要处理将联系人的电子邮件与表单中提交的内容同步: 两种策略:
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 );
}