2016-07-22 14 views
0

ich das follwing Problem haben, ich habe zwei Modelle, Niveau und Klasse, jede Ebene viele Klassen im Inneren hat, muss ich auf einmal alle Level-Klassen hinzuzufügen, mit dem follwing Format:Filter eloquent Beziehungen Daten

$levelclasses['0'][level_id]=1; 
$levelclasses['0'][class][0][supervisor_id]=2; 
$levelclasses['1'][level_id]=2; 
$levelclasses['1'][class][0][supervisor_id]=2; 

ich habe diese erfolgreich: nur die eingefügten Klassen

$levelNewClasses; 
    $ids; 
    $count=0; 

    foreach ($data['levelclasses'] as $levelClass) { 
     $level=\App\InstituteLevel::find($levelClass['level_id']); 
     $ids[$count]=$level->id; 
     $count++; 
     foreach ($levelClass['class'] as $classdata) { 
      $class= new \App\EClass($classdata); 
      $class->school_year_id=\App\SchoolsYear::first()->id; 
      $level->classes()->save($class); 
      $levelNewClasses[$level->id][$class->id]=$class->id; 
     } 
    }    

aber jetzt möchte ich mit der Antwort zurück, nicht alle Klassen, wenn ich dies tun:

$level->classes; 

es wird alles zurückgeben, so dass ich die neuen Klassen-IDs in einem Array gespeichert und jetzt versuche ich, die Klassen zu filtern zurück aus dieser Beziehung $ Ebene-> Klassen basierend auf Thesen ids, habe ich versucht, diesen

foreach ($levels as $level){ 

     $levelclasses=$level->classes->pluck('id'); 

     $level->classes=$levelclasses->intersect($levelNewClasses[$level->id]); 
    } 

aber das geht nicht! , Irgendwelche Vorschläge?

+0

was meinst du mit ** eingefügte Klassen **? Können Sie den Code hinzufügen, in den Sie die Klasse einfügen? – jaysingkar

+0

Ich habe den Code, ich meine durch eingefügte Klassen, sind nur die Klassen, die mit dieser Anfrage erstellt, wenn ich auf die Beziehung zugreifen, gibt es alle Klassen zurück. –

+0

Wenn Sie die eingefügten Klassen zurückgeben möchten, geben Sie einfach die von der Anfrage empfangenen Klassen zurück. In diesem Fall ist Ihre '$ levelClass ['class']' Variable. – jaysingkar

Antwort

1

Überprüfen Sie den folgenden Code. Ich denke, es würde funktionieren.

$levelNewClasses; 
    $ids; 
    $count=0; 
    insertedClasses = array();//Array to store inserted classes 
    foreach ($data['levelclasses'] as $levelIndex=>$levelClass) {\\updated to include level index 
     $level=\App\InstituteLevel::find($levelClass['level_id']); 
     $ids[$count]=$level->id; 
     $count++; 
     foreach ($levelClass['class'] as $index=>$classdata) { 
      $class= new \App\EClass($classdata); 
      $class->school_year_id=\App\SchoolsYear::first()->id; 
//Use following code to get all the inserted classes as array 
      $insertedClasses[$levelIndex][$index] = $level->classes()->save($class)->toArray();\\updated to use 2d array to store both level and class 
      $levelNewClasses[$level->id][$class->id]=$class->id; 
     } 
    } 
+0

Dieser Code gibt nur die letzte hinzugefügte Klasse zurück. In meiner Antwort möchte ich jede Ebene mit allen eingefügten Klassen zurückgeben. –

+0

@ محمود عبد الكريم hat den Code so aktualisiert, dass er den Ebenenindex enthält. check it only – jaysingkar

+0

Du hast meinen Tag gerettet Bruder, inspirierst du mich, dieses Problem zu lösen, vielen Dank. –

1

Dies ist ein bisschen wie ein hacky Weg, es zu tun, aber wenn Ihr Modell die created_at oder updated_at Zeitstempel hat (standardmäßig Eloquent Modelle tun), können Sie sehen, ob es in den letzten Sekunden erstellt oder aktualisiert wurde. Zum Beispiel, um zu sehen, ob es in den letzten 10 Sekunden erstellt wurde:

foreach($level->classes as $class) { 
    if($class->created_at->diffInSeconds(Carbon::now()) < 10) { 
    // do something... 
    }  
} 

Um dies zu tun, müssen Sie Carbon importieren. Setzen Sie dazu use Carbon\Carbon; an die Spitze Ihrer Klasse.

Im Wesentlichen ermittelt der obige Code, wann jede der Klassen der Ebene erstellt wurde, vergleicht sie in Sekunden mit der aktuellen Zeit und gibt diese if-Anweisung ein, wenn die Klasse weniger als 10 Sekunden vor der aktuellen erstellt wurde Zeit (Carbon::now()). Natürlich müssen Sie nicht unbedingt 10 Sekunden machen - finden Sie heraus, welche Zeit am besten für Sie ist.

Wie gesagt, dies ist ein bisschen ein Hack, und funktioniert möglicherweise nicht in allen Fällen, aber ich denke, es wird für den Fall, den Sie beschreiben, funktionieren. Hoffe das hilft!

+0

Vielen Dank für Ihre Hilfe, Sie sind sehr willkommen, wie Sie sagten, dies funktioniert nicht in allen Fällen, aber ich frage mich, ob es eine Möglichkeit gibt, die Daten der Beziehung selbst zu ändern, zum Beispiel einige Datensätze löschen nach dem Abrufen? –

Verwandte Themen