2014-09-26 9 views
9

Mam następujący kod:Eloquent sync i created_at/updated_at

$entry->save(); 

$categories = []; 

$categories[Input::get('main_category')] = ['main' => 1]; 

for ($i=1; $i<=4 ; ++$i) { 
    $input = Input::get('category_'.$i); 
    if ($input != '') { 
      $categories[$input] = ['main' => 0]; 
    } 
} 



$entry->categories()->sync($categories); 

$inTags = explode(',', trim(Input::get('tags'), ',')); 
$tags = []; 

foreach ($inTags as $tag) { 
    $tag = trim($tag); 
    if ($tag == '') { 
     continue; 
    } 
    $fTag = Tag::firstOrCreate(array('name' => $tag)); 

    $tags[$fTag->id] = ['entry_id' => $entry->id]; 
} 
$entry->tags()->sync($tags); 

W powyższym kodzie tworzę wpis ($entry->save() jest tu tyle, aby go zrozumieć, wcześniej kod nie jest ważne), a następnie zapisać do której z kategorii ten wpis należy do (używając tabeli przestawnej) i wykonaj to samo z tagami (ale dla tagów jeśli tag nie istnieje tworzę go).

Jednak w obu tabelach przestawnych created_at pole jest pozostawione domyślne (0000-00-00 00:00:00) po wstawieniu danych (prawdopodobnie to samo będzie z updated_at, ale nie testowałem tego).

Czy muszę w jakiś sposób automatycznie aktywować sygnatury czasowe zgłoszenia, czy też muszę je samodzielnie wypełnić ręcznie (ale prawdopodobnie będzie to oznaczać o wiele więcej kodowania i nie używać sync)?

+3

Dostarczasz 'sync' z tablicą asocjacyjną, podczas gdy akceptuje ona tablicę' id 'do zsynchronizowania. A dla znaczników czasu w tabeli przestawnej - musisz użyć 'withTimestamps()' w definicji relacji, w przeciwnym razie nie zostaną one ustawione/zaktualizowane. –

+0

@JarekTkaczyk Dzięki 'withTimestamps()' rozwiązano problem. Ale używając 'sync' możesz dodać dodatkowe dane przestawne - zobacz http://laravel.com/docs/4.2/eloquent#working-with-pivot-tables i section' Dodawanie danych przestawnych podczas synchronizacji' –

+0

Tak, możesz zrobić to, jeśli są to dane przestawne. Myślałem, że przekazałeś tam jeden z kluczy do relacji. –

Odpowiedz

25

W celu obsługi znaczników czasu przestawnych podczas synchronizacji/attach belongsToMany relację, trzeba to withTimestamp() sprawie definicji Powiązania:

// some model 
public function someRelation() 
{ 
    return $this->belongsToMany('RelatedModel')->withTimestamps(); 
} 

Następnie każdy sync/attach/updateExistingPivot będzie ustawić/aktualizować sygnatury czasowe na własną Stół obrotowy.