Laravel:更新hasMany/BelongTo关系


Laravel: Updating hasMany/BelongTo relation

我有一个主表jobs,在单独的表job_location中有多个位置。现在,如果从job_location中发现额外的行,我将无法更新/删除。现在我之所以说DELETE是因为sync()做到了这一点,但它与多对多的关系有关。我是laravel的新手,只是想找到一种雄辩的方法来实现这一点,否则删除所有行并插入可以很容易地完成,或者更新每一行并删除剩余行也是一种选择,但我想知道laravel对此有什么用。

在每个请求中,我都会得到多个工作地点(城市、电话号码、地址不变/更改),这会带来麻烦。

一些代码快照:

型号:[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(如果存在)。我可以去掉以前的条目,但如果更新以前的条目并输入新的条目,或者如果我们有额外的条目,它们就会被删除,那就太好了。我知道这听起来很奇怪,但仍然能指引我一条路。

是的,你不能使用相同的函数,做这个

$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();
}

类似这样的东西:

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