关联查找
- hasOne主表拥有副表的资源
在主表模型层使用hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');
直接用主表名::get('id值');
- belongsTo相对关联
在副表模型层使用belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');
直接用副表名::get('id值');
关联新增
- 使用正规封装
//控制器使用封装模型
$data=[
'user_name'=>'zhuoxiang123','password'=>md5(123),
'pic_url'=>'aaaa','thumb_url'=>'bbb',
];
$obj=new Member();
$result=$obj->add($data);
//模型
public function add($data){
try{
//开启事务
$this->startTrans();
$this->isUpdate(false)->allowField(true)->save($data);
$this->logo()->save(['pic_url'=>$data['pic_url'],'thumb_url'=>$data['thumb_url']]);
$this->commit();
return true;
}catch(Exception $e){
$this->error=$e->getMessage();
$this->rollback();
return false;
}
}
- hasOne形式
//控制器直接使用(不规范,严谨在项目中使用)
$obj=Member::create(['user_name'=>'zhuo','password'=>md5(123)]);
$obj->logo()->save(['pic_url'=>'aaa','thumb_url'=>'bbb']);//logo是从表中的方法
- 关联自动写入的定义,需要配合hasOne中的定义方法名
//添加主表Member数据
$obj1=New Member();
$obj1->user_name='zhuoxiang2333';
$obj1->password=md5(123);
//添加副表Avatar数据
$obj2=New Avatar();
$obj2->pic_url='cccc';
$obj2->thumb_url='cccc';
$obj1->logo=$obj2;
$result=$obj1->together('logo')->save();
var_dump($result);
关联修改
第一种:(不推荐,在项目不要在控制器写逻辑)
$obj=Member::get(1024);
$result=$obj->logo->save(['thumb_url'=>'cccccc']);
var_dump($result);
第二种:(常用)
//控制器
$data=[
'user_id'=>1024,
'user_name'=>'zhuo666666',
'password'=>md5(123),
'pic_url'=>'aaaa',
'thumb_url'=>'qqqqqqqqqqq2',
];
$obj=new Member();
$result=$obj->edit($data);
//模型层更新封装
public function edit($data){
try{
$this->startTrans();
if(empty($data)){
return false;
}
$this->isUpdate(true)->allowField(true)->save($data);
$this->logo()->save(['pic_url'=>$data['pic_url'],'thumb_url'=>$data['thumb_url']]);
$this->commit();
return true;
}catch(Exception $e){
$this->error=$e->getMessage();
$this->rollback();
return false;
}
}
第三种:(更改字段少时好用)
$obj=Member::get(1025);
$obj->password=md5(12345678);
$obj->logo->pic_url='1234567.jpg';
$result=$obj->together('logo')->save();
var_dump($result);
关联删除
方法1:(快速,常用)
//控制器(也可以封装到模型)
$obj=Member::get(1027);
$result=$obj->togetther('logo')->delete();
var_dump($result);
方法2:(麻烦)
//控制器
$obj=Member::get(1027);
$result=$obj->delete();//删主表
$result=$obj->logo()->delete();//删副表
var_dump($result);
方法3:使用模型层封装上面的的代码
//控制器使用
$result=Member::delete2(1027);
var_dump($result);
//使用new方式
public function delete2($data){
try{
$this->startTrans();
$obj=Member::get($data);//可以使用$obj=$this->find($data);
$obj->delete();
$obj->logo()->delete();
$this->commit();
return true;
}catch(Exception $e){
$this->error=$e->getMessage();
$this->rollback();
return false;
}
}
//使用静态方式
public static function delete3($data){
try{
self::startTrans();
$obj=Member::get($data);
$obj->delete();
$obj->logo()->delete();
self::commit();
return true;
}catch(Exception $e){
self::rollback();
return false;
}
}
评论