2016-04-06 78 views
0

我有一个master表jobs与多个位置在单独的表job_location。现在我无法更新/删除,如果从job_location找到额外的行。现在为什么我说DELETE是因为sync()这样做,但它与多对多关系有关。我是laravel的新手,只是试图获得雄辩的方法来实现这一点,否则删除所有行和插入可以轻松完成或更新每个和删除剩余也是一种选择,但我不知道Laravel有这个东西。Laravel:更新hasMany/BelongTo关系

在每次请求中,我都会得到多个创建问题的工作地点(城市不变,电话号码,地址)。

一些codeshots:

型号:[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'); 
    } 

} 

型号:[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'); 
    } 

} 

控制器:[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); 
    } 

} 

在这种方法中,我能够保存所有的工作位置,但我使用相同的功能来更新。请告诉我如何更新jobLocations如果存在。我可以放弃以前的条目,但如果以前得到更新并且新输入,或者如果我们有额外的条目被删除,这将是很好的。我知道听起来很奇怪,但仍然指引我。

+0

也许这样的事情可以帮忙它遍历对于给定作业的所有joblocations。 '$ job = Job :: find(ID); JobLocation :: where('id',$ job-> id) - > get(); // < - 循环与foreach通过这个?' –

回答

0

啊,你不能使用相同的功能,这样做

$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

事情是这样的:

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); 

}