2014-09-26 11 views
9

Ich habe den folgenden Code:Eloquent Sync und 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); 

In obigem Code I-Eintrag erstellen ($entry->save() hier gerade genug ist, um es zu verstehen, früher Code ist nicht wichtig), dann speichern Sie auf, welche Kategorien dieser Eintrag gehört zu (mit Pivot-Tabelle) und mache das gleiche mit Tags (aber für Tags, wenn das Tag nicht existiert, erstelle ich einen).

Allerdings in beiden Pivot-Tabellen created_at Feld ist Standard (0000-00-00 00:00:00) nach dem Einfügen von Daten (wahrscheinlich das gleiche wird mit updated_at sein, aber ich habe es nicht getestet).

Muss ich Filing-Zeitstempel irgendwie automatisch aktivieren oder muss ich sie manuell ausfüllen (aber wahrscheinlich wird es viel mehr Codierung und keine Verwendung von sync bedeuten)?

+3

Sie stellen 'sync' mit assoziativem Array bereit, während sie ein Array von' ids' zum Synchronisieren akzeptiert. Und für die Zeitstempel in Ihrer Pivot-Tabelle müssen Sie 'withTimestamps()' in der Beziehungsdefinition verwenden, sonst werden diese nicht gesetzt/aktualisiert. –

+0

@ JarekTkaczyk Danke 'withTimestamps()' löste das Problem. Aber mit 'sync' können Sie zusätzliche Pivot-Daten hinzufügen - siehe http://laravel.com/docs/4.2/eloquent#working-with-pivot-tables und Abschnitt' Pivot-Daten beim Synchronisieren hinzufügen' –

+0

Ja, das können Sie tun wenn es sich um Pivot-Daten handelt. Ich dachte, du hättest einen der Beziehungsschlüssel dort hingelegt. –

Antwort

25

Um Pivot-Zeitstempel zu handhaben, wenn Sie belongsToMany Beziehung synchronisieren/attach, müssen Sie withTimestamp() über die Beziehung Definition sind:

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

jeden Dann sync/attach/updateExistingPivot wird eingestellt/aktualisieren, um die Zeitstempel auf Ihrem Pivot-Tabelle.