2016-04-06 4 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); 

} 
Смежные вопросы