php中实现数据关联查询的原理是怎样的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php中实现数据关联查询的原理是怎样的?相关的知识,希望对你有一定的参考价值。
在很多框架中都有看到关联查询,比如 laravel 、yii 中都有hasOne 、hasMany等实现数据库关联查询,我本以为是先做一次查询,再从查询结果中取出所需连接数据做二次查询,但发现这太费时间了,我知道最简单的用 left jion做联合查询,但不知怎么动态连接数据和分离数据,求懂得大神说说原理!!!!!
参考技术A hasOne, hasMany 这是ORM 的一种关系。你猜想的没错,很多都是先做一次查询,再根据第一次查询结果进行二次查询。
一般来说left jion 的效果比二次查询要慢哦。
如果这样操作没有问题就可以了,还有不懂得你可以去后盾人看看视频学习,视频很全面哦 参考技术B
hasOne, hasMany 这是ORM 的一种关系。
你猜想的没错,很多都是先做一次查询,再根据第一次查询结果进行二次查询。
一般来说left jion 的效果比二次查询要慢哦。
JPA中实现双向一对一的关联关系
场景
按照上面的流程实现以上映射关系后,怎样在JPA中实现双向一对一的映射关系。
比如部门与经理就是双向一对一的关系。
注:
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
为了构造出双向一对一的关联关系,新增经理和部门两个数据库表和实体类。
新建数据库表JPA_MANAGERS经理表
设计部门表JPA_DEPARTMENTS
然后新建部门实体类Department
package com.badao.jpa.helloworld;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Table(name="JPA_DEPARTMENTS")
@Entity
public class Department
private Integer id;
private String deptName;
private Manager mgr;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
@Column(name="DEPT_NAME")
public String getDeptName()
return deptName;
public void setDeptName(String deptName)
this.deptName = deptName;
//使用 @OneToOne 来映射 1-1 关联关系。
//若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 1-1 关联关系, 所以需要添加 unique=true
@JoinColumn(name="MGR_ID", unique=true)
@OneToOne(fetch=FetchType.LAZY)
public Manager getMgr()
return mgr;
public void setMgr(Manager mgr)
this.mgr = mgr;
注:
1.使用 @OneToOne 来映射 1-1 关联关系。
2.若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 1-1 关联关系, 所以需要添加 unique=true。
3.这里是双向的一对一映射,所以要选择一方作为维护主要关联关系的一方添加@JoinColumn(name="MGR_ID", unique=true)
然后再新建经理实体类
package com.badao.jpa.helloworld;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Table(name="JPA_MANAGERS")
@Entity
public class Manager
private Integer id;
private String mgrName;
private Department dept;
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
@Column(name="MGR_NAME")
public String getMgrName()
return mgrName;
public void setMgrName(String mgrName)
this.mgrName = mgrName;
//对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy=另一方外键
@OneToOne(mappedBy="mgr")
public Department getDept()
return dept;
public void setDept(Department dept)
this.dept = dept;
注:
1.对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy=另一方外键。
2.因为此方不维护关联关系,所以直接使用@OneToOne的mappedBy属性,属性值对应的是另一方的外键属性名。
然后在配置文件persistence.xml中添加实体类的配置
<class>com.badao.jpa.helloworld.Manager</class>
<class>com.badao.jpa.helloworld.Department</class>
添加位置如下
然后编写单元测试方法
@Test
public void testOneToOnePersistence()
Manager mgr = new Manager();
mgr.setMgrName("M-BB");
Department dept = new Department();
dept.setDeptName("D-BB");
//设置关联关系
mgr.setDept(dept);
dept.setMgr(mgr);
//执行保存操作
entityManager.persist(mgr);
entityManager.persist(dept);
注:
双向 1-1 的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 UPDATE 语句。
运行单元测试方法后查看数据库表
经理表
部门表
以上是关于php中实现数据关联查询的原理是怎样的?的主要内容,如果未能解决你的问题,请参考以下文章