【问题标题】:Laravel: Updating hasMany/BelongTo relationLaravel:更新 hasMany/BelongsTo 关系
【发布时间】:2016-04-06 19:29:48
【问题描述】:

我有一个主表 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(如果存在)。我可以放弃以前的条目,但是如果以前的条目得到更新并输入新的条目,或者如果我们有额外的条目被删除,那就太好了。我知道这听起来很奇怪,但仍然指导我。

【问题讨论】:

  • 也许这样的事情可以帮助它遍历给定工作的所有工作地点。 $job = Job::find(ID); JobLocation::where('id',$job->id)->get(); //<-- loop with the foreach through this?

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    类似这样的:

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

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2022-01-16
      • 2017-05-17
      相关资源
      最近更新 更多