我有一个主表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);
}