2013-07-05 2 views
4

2 가지 모델 인 연락처 및 이메일이 있습니다. 나는 'laravel을 사용하여 일대 다 관계를 업데이트 할 뷰를 어떻게 만듭니 까?

... 희망

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

} 

지금까지 올바른 궤도에있어 : ​​모든 접촉은 여러 이메일 주소를 가질 수있다, 그래서 모델에 일대 다 관계를 만들었습니다 했습니다가 연락 모델 제프 웨이의 발판을 사용, 그래서 컨트롤러에서이 업데이트 방법에있어 : ​​또한

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 

업데이트 방법을 수정하여 이메일을 수정 (수정 된 경우)하고 새 이메일을 추가 (입력 한 경우)하는 방법에 대해 알지 못합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있다면 감사하겠습니다. - 감사합니다!

+0

당신은 '사용할 수있는 푸시() ... 시작하는 당신의 방법에 당신을 얻을해야'A 모델과 관계 [링크] (http://laravel.com/docs/를 저장하기위한 방법 설득력있는 # insert-update-delete) –

+0

고마워, 이것이 올바른 방향 일지 모르겠다. 그러나 이것에 대해 좀 더 도움이 필요하다. 이메일 테이블의 해당 행을 업데이트하고 아직 존재하지 않는 경우 행을 추가하려면 어떻게해야합니까? – PollenBrands

답변

4

이에 대한 대답은 반드시 Laravel 별 대답하지 않습니다.

상관없이 양식으로 제출 무슨과 연락처의 이메일을 동기화 처리 필요 :

두 가지 전술 :

  1. 이 접촉과 관련된 모든 이메일 삭제합니다. 그런 다음 양식에있는 내용을 기반으로 새 이메일을 만드십시오. 그렇게하면 항상 새 이메일을 삽입합니다.
  2. 연락처와 관련된 모든 이메일을 받으십시오. 그들을 반복하십시오. 양식의 제출 된 이메일 ID가 기존 이메일과 일치하는 경우 해당 이메일 주소를 업데이트하십시오. 이메일이 새 메일 인 경우 (ID가 연결되어 있지 않은 경우) 새 이메일을 만드십시오. 이 옵션은 중첩 된 루프를 필요로하며, 기술적으로 훼방해야합니다. 그러나 이메일 수가 적 으면 큰 문제는 아닙니다.

이제 얻을 수 Laravel (4)

특이

웅변 관계를 갱신 처리 할 수있는 편리한 sync() 방법이있다 - 그러나, 나는 그것이 많은 관계로 많은 만의 생각, 따라서 "피벗에 의존을 표".

웅변도 push() 방법이 있지만 나는 아직 연주하지 않은 이후이 장면 뒤에 관련 이메일을 "동기화"하거나 새로운 관계를 추가하면, 나는 확실하지 않다. 이것이 최선의 방법입니다. 옵션 1의 https://twitter.com/fideloper/status/353303438664278018

: email[]에 (기존 또는 새로운 여부)

첫째, 모든 이메일 텍스트 필드의 이름을 바꾸

나는 응답 sonn을보기를 바라고, 그 요청 Laravel에 트위터. 삭제 된 이후로는 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> 

마이너 참고 : 당신은 라벨 for="" 속성이 올바른 텍스트 필드에 일치하도록 가능성이 $key 변수를 사용하여 텍스트 필드의 ID를 돌봐 할 수 있습니다. 나는 너에게 맡길거야.

그런 다음 PHP에서 $ 연락처와 연결된 모든 이메일을 삭제 한 다음 new와 같이 만듭니다. 옵션 2의

// Delete all related emails 
$contact->emails()->delete(); // I think this works. Otherwise do a manual query or loop through email email and `->delete()` them. 

// Create new ones 
foreach(Input::get("emails") as $email) 
{ 
    $newEmail = new Email; 
    $newEmail->email = $email; 
    $contact->emails()->save($email); 
} 

:

가 폼 데이터에서와 연관된 ID를 가지고 있지 않기 때문에 새 이메일이 존재하는 경우 당신은 알 수 있습니다. 새 이메일 들어, PHP에서 다음

@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); 
} 

, Input::get('email') 위의 예제에서 연락처 ($currentEmails = $contact->emails())와 관련된 현재 이메일을 가져와 필요할 경우 foreach 루프 (여기서 작성하지 않음)로 업데이트해야 할 수 있습니다. 그런

뭔가