2016-04-06 29 views
0

Ich habe eine Master-Tabelle jobs mit mehreren Standorten in separaten Tabelle job_location. Jetzt bin ich nicht in der Lage zu aktualisieren/zu löschen, wenn zusätzliche Zeilen von job_location gefunden werden. Jetzt, warum ich sage DELETE ist, weil sync() tat dies, aber es ist im Zusammenhang mit vielen-zu-viele-Beziehung. Ich bin neu in Laravel, nur versuchen, eloquent Ansatz, um dies zu erreichen, sonst alle Zeilen löschen und Einfügen kann leicht getan werden ODER aktualisieren und löschen Rest ist auch eine Option, aber ich frage mich, Laravel hat etwas dafür.Laravel: Aktualisierung hasMany/BelongTo Relation

In jeder Anfrage bekomme ich mehrere Stellen (mit unveränderter/geänderter Stadt, Telefonnummer, Adresse), die Probleme verursacht.

Einige codeshots:

Modell: [Job.php]

class Jobs extends Model 
{ 
    protected $fillable = [ 
     'job_id_pk', 'job_name','salary' 
    ]; 


    public function joblocation() { 
     return $this->hasMany('\App\JobLocation', 'job_id_fk', 'job_id_pk'); 
    } 

} 

Modell: [JobLocation.php]

class JobLocation extends Model 
{ 
    protected $fillable = [ 
     'jobl_id_pk', 'job_id_fk','city', 'address', 'phone_number' 
    ]; 


    public function job() { 
     return $this->belongsTo('\App\Jobs', 'job_id_fk', 'job_id_pk'); 
    } 

} 

Controller: [JobController.php ]

function jobDetail() { 

    if($params['jid']) {  
     // update 
     $obj = \App\Jobs::find($params['jid']); 
     $obj->job_name = $params['name']; 
     $obj->salary = $params['salary']; 
     $obj->save(); 
    } else {   
     // create new 
     $data = array(
      'job_name' => $params['name'], 
      'salary' => $params['salary'], 
     ); 
     $obj = \App\Jobs::create($data); 
    } 

    // don't bother how this $objDetail has associative array data, it is processed so 
    foreach ($params['jobLocations'] AS $key => $objDetail) { 
     $jobLoc = new \App\JobLocation; 
     $jobLoc->city = $objDetail['city']; 
     $jobLoc->phone_number = $objDetail['phone_number']; 
     $jobLoc->address = $objDetail['address']; 

     $jobLoc->job()->associate($obj); 
     $obj->jobLoc()->save($jobLoc); 
    } 

} 

In diesem Ansatz kann ich alle Job-Standorte speichern, aber ich verwende die gleiche Funktion, um auch zu aktualisieren. Bitte sagen Sie mir, wie ich jobLocations aktualisieren kann, falls vorhanden. Ich bin in Ordnung, vorherige Einträge zu verlieren, aber es wäre gut, wenn vorher aktualisiert und neu eingegeben wird ODER wenn wir zusätzliche Einträge haben, werden sie gelöscht. Ich weiß, klingt seltsam, aber immer noch einen Weg.

+0

Vielleicht wie etwas das könnte es alle joblocations helfen, für die gegebene Aufgabe Schleifen durch. '$ job = Job :: finden (ID); JobLocation :: where ('id', $ job-> id) -> get(); // <- Schleife mit der foreach durch? –

Antwort

0

Ja, Sie können nicht die gleiche Funktion verwenden, tun dies

$jobs = \App\Jobs::find($params['jid']); 

foreach ($params['jobLocations'] as $key => $objDetail) { 
    $joblocation = $jobs->joblocation->where('jobl_id_pk', $objDetail['some_id'])->first(); 

    //here update you job location 

    $joblocation->save(); 
} 
0

Etwas wie folgt aus:

Controller:[JobController] 

public function jobDetail() { 

    if(!empty($params['jid'])) {  
     // update 
     $job = \App\Jobs::find($params['jid']); 
     $job->job_name = $params['name']; 
     $job->salary = $params['salary']; 
     $job->save(); 
    } else {   
     // create new 
     $data = array(
      'job_name' => $params['name'], 
      'salary' => $params['salary'], 
     ); 
     $job = \App\Jobs::create($data); 
    } 

    $locationDetails = !empty($params['jobLocations']) ? $params['jobLocations'] : []; 

    $jobLocations = array_map(function($location) use($job) { 
     $location = array_merge($location, [ 'job_id_fk' => $job->job_id_pk ]); 
     return \App\JobLocation::firstOrNew($location); 
    }, $locationDetails); 

    $job->jobLocations()->saveMany($jobLocations); 

} 
Verwandte Themen