簡體   English   中英

Laravel:更新hasMany / BelongTo關系

[英]Laravel: Updating hasMany/BelongTo relation

我在單獨的表job_location有多個位置的主表jobs 現在,如果從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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM