2013-12-19 5 views
5

laravel에서 관련 리소스를 양식에 중첩시키는 방법이 있습니까?양식에서 중첩 모델 관계 - Laravel

class Person extends Eloquent { 
    public function addresses() { 
    return $this->hasMany("Address"); 
    } 
} 

class Address extends Eloquent { 
    public function person() { 
    return $this->belongsTo("Person"); 
    } 
} 

와 나는 Person 형태가 PersonAddress ES에 대한 정보를 수집 할 :

내가이이 말. laravel은 Rails의 accepts_nested_attributes_for :addressfields_for :address과 동일한 방식으로이 작업을 용이하게합니까?

I 좋겠 단지 Address 정말 떨어져 Person에서 존재하지 않기 때문에 내가의 Person 형태의 결과로 Address 필드를 포함 수있는 간단한 것이있다. 이게 말이 돼?

== 편집 ==

내가 무엇을 찾고 있어요 것은이 닮은 것 뭔가 가상 코드를 다음과 같습니다

{{ Form::model(new Person, array("action" => "admin\[email protected]", "method" => "POST")) }} 

{{ Form::text("name", array(...)) // <input name='person[name]' ... /> }} 


{{ Form::email("email", array(...)) // <input name='person[email]' ... /> }} 

{{ Form::fields_for("addresses"/* Would be name of relation */) }} 

    {{ Form::text("street_address") // <input name='person[addresses][][street_address]' ... /> }} 

{{ Form::close_fields() }} 

{{ Form::close() }} 
+0

여기에 무엇이 표시되는지 잘 모르겠습니다. 양식의 선택 상자에있는 주소 목록을 통해 가져온 것이 있습니까? 또 다른 메모에서 관계를 정의 할 때 메소드를 거의 호출 할 수는 있지만 한 사람 만 주소에 속하고 여러 명이 아닌 사람에게 '사람'이라고 이름을 짓습니다. –

+0

같은 양식을 사용하여 Person이 생성 된 것과 동시에 주소를 만들고 싶습니다. – Goldentoa11

+0

'Address :: persons'는 오타였습니다. 고정 – Goldentoa11

답변

11

합니다.

// Form open, Person fields, etc... 

<h2>Addresses</h2> 
@foreach ($addresses as $address) 

    <fieldset> 

     {{ Input::text('addresses['.$address->id.'][address_1]', $address->address_1) }} 
     {{ Input::text('addresses['.$address->id.'][address_1]', $address->address_2) }} 
     {{ Input::text('addresses['.$address->id.'][city]', $address->city) }} 
     {{ Input::text('addresses['.$address->id.'][state]', $address->state) }} 
     {{ Input::text('addresses['.$address->id.'][zip]', $address->zip) }} 

    </fieldset> 

@endforeach 

// Form Close 

당신이 대신 주소 ID를 사용하는 몇 가지 임의의 키를 생성해야합니다 주소를 추가하려면

양식. 필드를 그룹화 된 상태로 유지합니다.

컨트롤러 로직

이 내가 모델로가는 데이터를 필터링하는 '채울'를 사용하여 입력을 처리 할 방법이다.

// Get the Person model, fill, save, etc... 

$addressIds = array(); 
foreach (Input::get('addresses', array()) as $id => $addressData) 
{ 
    $address = Address::find($id) ?: new Address; 
    $address->fill($addressData); 
    $address->save(); 
    $addressIds[] = $address->id; 
} 

$changes = $person->addresses()->sync($addressIds); 

// Delete the unused addresses 
foreach ($changes['detached'] as $detachedAddressId) 
{ 
    $address = Address::find($detachedAddressId); 
    if (!empty($address)) $address->delete(); 
} 
+0

'임의의 키 생성' 그래도 새 주소는 맞지? 그냥 비어있는 것일뿐입니다. 코드를 게시하면 잘 처리 할 수있는 것처럼 보입니다. – Goldentoa11

+0

두 개 이상의 주소를 추가하지 않는 한. 이 경우 두 필드 그룹을 구별해야합니다. –

+0

흠. 나는 그것이'$ _FILES'처럼 끝날 것이라고 생각했다. – Goldentoa11

0

당신은 모두를 관리해야한다은 이건 네 컨트롤러에서 나온거야. 당신이 원하는대로 그들을 양식에서 데이터를 수집하고 사용 : 사용자가 입력 이름이 올바른 궤도에

// Controller Code 
$person = new Person(array(
    'field_1' => Input::get('field_1'), 
    'field_2' => Input::get('field_2'), 
    ............. 
)); 
$person->save(); 

$address = new Address(array(
    'field_x' => Input::get('field_x'), 
    'field_y' => Input::get('field_y'), 
    ............. 
)); 
$person->addresses()->save($address); 

See it in the docs

+0

확인. 이것은 의미가 있습니다. 다음 질문은 어리석은 일 이겠지만 새로운 주소를 인스턴스화하고 연관시키는 키 스트로크를 저장하기 위해 다른 매개 변수와 함께'Person'에'Address'를 전달할 방법이 있습니까? – Goldentoa11

+0

나는 그것을 대답으로 썼다. 그러나 나는 생각했다 : "그것은 hasMany() 관계이다!".당신은 할 수 있지만 먼저 출력해야 할 주소를 찾아야합니다. 그런 다음 두 번째 인수를 전달하여 자동 완성되도록하십시오. '{{Form :: text ("field_x", $ person-> address-> field_x)}}' – clod986