Laravel 模型关联 新增及更新操作

参照手册,手册有详细说明

https://learnku.com/docs/laravel/5.6/eloquent-relationships/1404#inserting-and-updating-related-models

 

 

1.通过事务

Laravel 关联模型-关联新增和关联更新:  https://blog.csdn.net/u010791660/article/details/83030748

网上找了 Laravel 相关的关联新增和关联更新文档,写的都不是很满意。(基本都在抄文档)下面整理下自己代码中的关联操作方法

  • 按照 Laravel 文档中的说明设置关联模型 参考地址
//病人模型
class Patient extends Model
{
    /**
     * 病人附表
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function patientdata ()
    {
        return $this->hasOne(PatientData::class);
    }
    
 //病人附表模型
class PatientData extends Model
{
    public function patient()
    {
        return $this->belongsTo(Patient::class);
    } 
    

关联更新代码

/**
 * 新增病人信息
 * @param array $data
 *
 * @return bool
 */
public function savePatient($data=[])
{
    DB::beginTransaction();
    if($patient = $this->create($data)){
        if ($res = $patient->patientdata()->create(["数据"])){
            DB::commit();
        } else{
            DB::rollBack();
        }
        return true;
    }
    return false;
}

关联更新代码

public function updatePatient($data=[])
{
    DB::beginTransaction();
    //先通过主键获得病人模型的实例
    $patient = $this->find($data['id']);
    if($patient->update($data)){
        if ($res = $patient->patientdata()->where('patient_id',$data['id'])->update(["数据"])){
            DB::commit();
        } else{
            DB::rollBack();
        }
        return true;
    }
    return false;
}

 

 

2.通过sync函数

https://blog.csdn.net/weixin_43674113/article/details/84585143

   public function store(Request $request)
    {
        //商品新增
        $product = Product::create($request->all());//本表
        //分类
        $product->categories()->sync($request->category_id);//多对多关联更新
        //相册
        foreach ($request->imgs as $v){
            $img=['img'=>$v];
            $product->product_galleries()->create($img);//一对多更新
        }

        return redirect('/admin/shop/products');
    }

 

 

 

https://juejin.im/post/5a6ade26f265da3e4b76ff00

闲话不多说,直接起飞:

使用场景:

在使用laravel框架开发的过程中,我们经常会遇到 三张表 之间 有关联的操作,比如如下:

表1: 店铺表 store

元素 类型 描述
store_id int 主键
store_name varchar(255) 名称

表2: 店铺标签表 tag

字段 类型 描述
tag_id int 主键
tag_name varchar(255) 属性名称

表3: 店铺与标签的关系表 tag_group

字段 类型 描述
tag_id int 标签id
store_id int 店铺id

注意:店铺表与标签表示多对多的关系

表列出来以后,然后我们会经常遇到一个这样的操作:

添加一个店铺,并且会在添加的时候给店铺挂载标签

面对这样的需求 我们常规的做法是如下:

0) {
    foreach ($data['tag_ids'] as $value) {
        $res[] = TagGroup::create(['store_id'=>$result->store_id,'tag_id'=>$value]); //绑定关系
    }
}
?>

复制代码

按照上面的代码写下来 估计在修改的店铺标签的时候 估计会炸掉! 因为首先要查 这个标签绑定过没 绑定了的 要删除 并把没有绑定过的再绑定上 多麻烦 所以 有需求就有解决方案! 如下所示我们使用 sync() 来做关系:

tag->sync($data['tag_ids']); 
?>

复制代码

接下来我们需要在 Stroe model中 去定义一个关联模型

belongsToMany(Tag::class,'tag_group','tag_id','store_id');
     }
    }
?>

复制代码

这样 我们就可以 很方便的去给店铺 挂载标签 或者属性, sync() 为我们提供了 大部分的功能,比如在修改的时候他会自动去找,如果没有的去绑定或者删除...


作者:PFinal社区_南丞
链接:https://juejin.im/post/5a6ade26f265da3e4b76ff00
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

你可能感兴趣的:(Laravel)