2013-12-04 2 views
0

EDIT: Спасибо к ответу на clod986, который очистил несколько вещи о методе синхронизации(), я теперь изменил мой код:сводной таблицы отчеты заменяются в Laravel 4 Использование синхронизации

public function attachDelegates($eventId, $delegates) 
{ 
    $event = $this->find($eventId); 

    foreach ($delegates as $key => $value) 
    { 
     if(! $event->delegates->contains($key)) 
     { 
      $event->delegates()->attach($key, array(
       'delegate_status_id' => $value['delegate_status_id'], 
       'price'     => $value['price'], 
       'prerequisites'   => $value['prerequisites'], 
       'booking_id'   => $value['booking_id'] 
      )); 
     } 
    } 
} 

у меня есть 4 таблицы:

события, делегаты, неизвестных и сводная таблица называется delegate_event

в приложении вы можете или хранить несколько неизвестных делегатов о событиях или один неизвестный делегат в зависимости от ВАЗы t нажмите.

Проблема, с которой я столкнулась, заключается в том, что при первом хранении одного неизвестного делегата он отлично работает, но как только вы попытаетесь сохранить еще один неизвестный делегат, он сохранит делегат и неизвестно в своих соответствующих таблицах, но когда дело доходит до синхронизации делегата с событием в таблице delegate_event, оно заменит/обновит предыдущую запись. Добавление нескольких неизвестных делегатов отлично работает.

Вот мой код:

// Filename: AdminDelegatesController.php 
// Selection: 1 
public function store() 
{ 
    $delegateData = Input::except(array('delegate_status_id', 'price', 'event_id', 'account_id', 'amount')); 
    $eventId = Input::get('event_id'); 
    $event = $this->event->find($eventId); 
    $amount = Input::get('amount'); 

    if (! empty($amount)) 
    { 
     $message = (object) array(
      'title'   => 'Excellent!', 
      'content'  => 'The unknown delegates were successfully added to the event.', 
      'alert_type' => 'success' 
     ); 
     $price = Input::get('price')/$amount; 
     $data = array(
      'delegate_status_id' => Input::get('delegate_status_id'), 
      'price'     => $price, 
      'prerequisites'   => 'on' 
     ); 
     $unknowns = array(); 
     for ($i = 0; $i < $amount; $i++) 
     { 
      $unknownKey = 'unknown-'.$event->start_date->toDateString().'-'.(int) rand(0,9999); 
      $data['key'] = $unknownKey; 
      $unknowns[] = $data; 
     } 
     $unknownData = $this->unknown->storeUnknowns($unknowns); 
     $delegates = $this->delegate->storeDelegates(null, $unknownData, $eventId, null); 
     $this->event->storeDelegates($eventId, $delegates); 
    } 
    else 
    { 
     $message = (object) array(
      'title'   => 'Excellent!', 
      'content'  => 'The unknown delegate was added successfully to the event.', 
      'alert_type' => 'success' 
     ); 
     $unknownKey = 'unknown-'.$event->start_date->toDateString().'-'.(int) rand(0,9999); 
     $data = array(
      'key'     => $unknownKey, 
      'delegate_status_id' => Input::get('delegate_status_id'), 
      'price'     => Input::get('price'), 
      'prerequisites'   => 'on' 
     ); 
     $unknowns = array($data); 
     $unknownData = $this->unknown->storeUnknowns($unknowns); 
     $delegate = $this->delegate->storeDelegates(null, $unknownData, $eventId, null); 
     $this->event->syncDelegates($eventId, $delegate); 
    } 
    return Redirect::back()->with('message', $message); 
} 

// Filename: Unknown.php 
// Selection: 1 
public function storeUnknowns($unknowns) 
{ 
    if (is_null($unknowns)) 
    { 
     return null; 
    } 
    foreach ($unknowns as $unknown) { 
     $delegate = $this->create(array('key' => $unknown['key'])); 
     $data[$delegate->id]['delegate_status_id'] = $unknown['delegate_status_id']; 
     $data[$delegate->id]['price'] = $unknown['price']; 
     $data[$delegate->id]['unknown_id'] = $delegate->id; 

     if (empty($unknown['prerequisites'])) 
     { 
      $data[$delegate->id]['prerequisites'] = '0'; 
     } 
     else 
     { 
      $data[$delegate->id]['prerequisites'] = $unknown['prerequisites']; 
     } 
    } 
    return $data; 
} 

// Filename: Delegate.php 
// Selection: 1 
public function storeDelegates($contactData, $unknownData, $eventId, $bookingId) 
{ 
    $delegates = array(); 
    if (!is_null($contactData)) 
    { 
     foreach ($contactData as $contact) 
     { 
      $delegate = $this->create(array('contact_id' => $contact['contact_id'], 'unknown_id' => '0')); 
      $delegates[$delegate->id]['delegate_status_id'] = $contact['delegate_status_id']; 
      $delegates[$delegate->id]['price'] = $contact['price']; 
      $delegates[$delegate->id]['prerequisites'] = $contact['prerequisites']; 
      $delegates[$delegate->id]['booking_id'] = $bookingId; 
     } 
    } 

    if (!is_null($unknownData)) 
    { 
     foreach ($unknownData as $unknown) 
     { 
      $delegate = $this->create(array('contact_id' => '0', 'unknown_id' => $unknown['unknown_id'])); 
      $delegates[$delegate->id]['delegate_status_id'] = $unknown['delegate_status_id']; 
      $delegates[$delegate->id]['price'] = $unknown['price']; 
      $delegates[$delegate->id]['prerequisites'] = $unknown['prerequisites']; 
      $delegates[$delegate->id]['booking_id'] = $bookingId; 
     } 
    } 

    return $delegates; 
} 

// Filename: Event.php 
// Selection: 1 
public function syncDelegates($eventId, $delegates) 
{ 
    $event = $this->find($eventId); 
    return $event->delegates()->sync($delegates); 
} 

При добавлении нескольких неизвестных делегатов в результате $ делегатов массив выглядит примерно так:

array(3) { 
    [1] array(4) { 
     ["delegate_status_id"] "2" 
     ["price"] 250 
     ["prerequisites"] "on" 
     ["booking_id"] NULL 
    } 
    [2] array(4) { 
     ["delegate_status_id"] "2" 
     ["price"] 250 
     ["prerequisites"] "on" 
     ["booking_id"] NULL 
    } 
    [3] array(4) { 
     ["delegate_status_id"] "2" 
     ["price"] 250 
     ["prerequisites"] "on" 
     ["booking_id"] NULL 
    } 
} 

Опять же, это хорошо работает, когда передается синхронизации метода. Он сохраняет все правильные отношения делегата в сводной таблице.

При сохранении одного неизвестного делегата, массив $ делегатов выглядит следующим образом:

array(1) { 
    [4] array(4) { 
     ["delegate_status_id"] "1" 
     ["price"] "3000" 
     ["prerequisites"] "on" 
     ["booking_id"] NULL 
    } 
} 

Опять же, это работает отлично один раз, но как только вы пытаетесь добавить еще один, он заменяет/обновляет запись с новым идентификаторы.

Может ли кто-нибудь указать мне в правильном направлении, пожалуйста? Благодарю.

ответ

1

Это предполагаемое поведение Laravel 4: в конце ->sync($array) вы будете иметь только элементы в массиве. Check here для более подробной информации.

Вы должны использовать другой подход: проверьте, находится ли элемент в коллекции, иначе добавьте его.

public function syncDelegates($eventId, $delegates){ 
    $event = $this->find($eventId); 
    foreach($delegates as $key => $value){ 
     if(!$event->delegates->contains($value)){ 
      $event->delegates()->attach($value); 
     } 
    } 
} 

Это должно добавить элементы, которые отсутствуют

+0

Ммм! Почему при добавлении кратных чисел с использованием одного и того же кода он отлично работает? –

+0

Ах! Игнорируйте последнее сообщение, я вижу, что это значит, я пропустил: «только идентификаторы в массиве будут на промежуточной таблице для модели» –

+0

Кроме того, не уверен, что этот код будет работать, так как мне нужно прикрепить сводные данные к каждому делегата на сводной таблице. –

Смежные вопросы