tp5一对一关联

是滑稽啊
2020-07-13 / 0 评论 / 173 阅读 / 正在检测是否收录...

关联查找

  1. hasOne主表拥有副表的资源

在主表模型层使用hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型');

直接用主表名::get('id值');

  1. belongsTo相对关联

在副表模型层使用belongsTo('关联模型名','外键名','关联表主键名',['模型别名定义'],'join类型');

直接用副表名::get('id值');

关联新增

  1. 使用正规封装
//控制器使用封装模型
$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;
        }
    }
  1. hasOne形式
//控制器直接使用(不规范,严谨在项目中使用)
$obj=Member::create(['user_name'=>'zhuo','password'=>md5(123)]);
$obj->logo()->save(['pic_url'=>'aaa','thumb_url'=>'bbb']);//logo是从表中的方法
  1. 关联自动写入的定义,需要配合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;
        }
}
0

评论

博主关闭了所有页面的评论