Laravel五大功能之Eloquent关系模式

Eloquent是Laravel的原始ActiveRecord是实现的,建立在Laravel的Fluent Query Builder之上的,所以Eloquent类和Fluent类是一样的,能实现复杂的SQL语句和非常直观表达出的表与表之间的关系

ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。

ActiveRecord的主要思想是:

1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;
2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;;
3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

现在我们讲讲ActiveRecord在Laravel中的应用

关于Eloquent的方法及其操作可以具体的可以看文档,在这里我们主要讲解表的关系

一对一的关系(one-to-one relationship)
关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
假如我们有一张user表和一张passport表是一对一的关系

首先让我们来表达出这样子的关系在我们的User类(用于操作user表)中

class User extends Eloquent
{
        public function passport()
        {
                return $this->has_one(‘Passport‘);//描述了在每一个用户都有对应的passport
        }
}  

如果我们想得到用户id为1的passport,我们应该怎么做呢?

$user = User::find(1);//实例化User表
if(is_null($user))
{
        echo "No User found!";
        return;
}
if($user->passport)
{
        //$user->passport将会得到$user对应的Passport实例,再来获取number
        echo "The user‘s passport number is".$user->passport->number;
}  

再来看看我们的Passport类(用于操作passport表)中,有一个外键user_id

class  Passport extends Eloquent
{
        public function user()
        {
                return $this->belongs_to(‘User‘);//这样我们就表达出了user_id这个外键对应的是user表
        }
}  

如果我们要通过一个passport来得到它所指向的用户的名字

$passport = Passport::find(1);
echo $passport->user->name;  

就是这么简单!laravel就是这么方便!如果你用过其他的PHP框架的话,一定能感觉到的!

一对多关系(one-to-many relationships)
关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。
假如我们有一张运动小组表,有运动员表许多的运动员,每一个运动员都属于某一个小组

表team

class Team extends Eloquent
{
    public function palyers()
    {
        return $this->has_many(‘Player’);
    }
}  

表players

class Player extends Eloquent
{
    public function team()
    {
        return $this->belongs_to(‘Team‘);
    }
}  

接着咱们来看看改如何来得到一个小组的所有成员呢?

$team = Team::find(1);
$palyers = $team->palyers()->get();
foreach($players as $player)
{
        echo ‘$play->name is on team $team->name‘;
}  

多对多关系(many-to-many relationships)
关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。要表示多对多关系,您必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。
假如有这样子三张表

每个学生都可以任意的挑选课程,每门课程也可以有任意的学生来挑选
现在来看看我们怎么定义Model
Student表的模型

class Student extends Eloquent
{
        public function courses()
        {
                return $this->has_many_and_belongs_to(‘Course‘);
        }
}  

Course表的模型

class Course extends Eloquent
{
        public function students()
        {
                return $this->has_many_and_belongs_to(‘Student‘);
        }
}  

让我们来使用我们的模型,通过找到id为1的学生选修的课程

$student = Student::find(1);  

if(is_null($student))
{
        echo "没有此学生";
        exit;
}  

if(!$student->courses)
{
        echo "学生: $student->name 没有选修任何课程。";
        exit;
}
else
{
        foreach($student->courses as $course)
        {
                echo "学生:$student->name 选修的课程有:$course->name";
        }
}  

接着我们来通过课程找出他所对应的所有学生

$course = Course::find(1);
if(is_null($course))
{
        echo "没有此课程";
        exit;
}
if($course->students)
{
        foreach($course->students as $student)
        {
                echo "该课程:$course->name选修的学生有:$student->name";
        }
}
else
{
        echo "课程暂时没有学生选修!";
        exit;
}  

如果我们想给一门没有被选修的课程添加信息应该怎么做呢?

$course = Course::find(12);
if(is_null($course))
{
        echo "该课程不存在!"
        exit;
}
$new_student = array(
        ‘name‘ => ‘沖田杏梨‘;
);  

$course->students()->insert($new_student);  
时间: 2024-10-21 05:05:49

Laravel五大功能之Eloquent关系模式的相关文章

23种Java设计模式(4)-关系模式

C.关系模式(11种) 先来张图,看看这11中模式的关系: 第一类:通过父类与子类的关系进行实现. 第二类:两个类之间. 第三类:类的状态. 第四类:通过中间类 父类与子类关系 一.策略模式(strategy) 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下: 图中ICalculator提供同意的方法,A

关系模式设计理论 - 数据库系统原理

模式设计理论主要包括三方面的内容:数据依赖.范式.模式设计方法.数据依赖研究数据之间的联系,起着核心的作用:范式是关系模式的标准:模式设计方法是自动化设计的基础. 关系模式的设计准则 关系模式的冗余和异常 关系模式的冗余指数据冗余.数据冗余 指同一个数据在系统中多次重复出现,这一直是影响系统性能的大问题.在文件系统中由于文件之间没有联系,一个数据会在多个文件中出现.数据库系统克服了文件系统的这种缺陷. 由于数据冗余,对数据操作时就会引起各种异常:修改异常.插入异常.删除异常.例如,关系模式 R(

00微信公众平台 - 以上五大功能整合,完整的代码。

一.代码实现如下(主程序代码,其他include代码见各个功能函数中) <?php /** * wechat php test * version 1 */ define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); //$wechatObj->valid(); class wechatCallbackapiTest

ER图,以及转化成关系模式

1.找出条件中的实体(矩形),属性(椭圆),关系(菱形)关系分为1:1,1:N,M:N,列出ER图 2. -1:1联系的转换方法 -两个实体分别转化为一个关系模式,属性即是本来的属性 -关系可以与任意一个实体合并,关系的属性,以及另一个实体的主码要加到合并到的关系模式里面 -1:n联系的转化方法 -两个实体分别转化为一个关系模式,属性即是本来的属性 -关系和n端的实体合并,关系的属性,以及另一个实体的主码要加到合并到的关系模式里面 --m:n联系的转化方法 -两个实体分别转化为一个关系模式,属性

关系型数据库:关系模式设计原则

1.范式与数据冗余度从0NF到1NF.2NF.3NF.BCNF.4NF.5NF?数据库设计的过程是个拆分表的过程,拆分的目的是降低数据的冗余度. 数据的冗余度越低,事务持续时间就越短(它不需要额外的操作去维持数据一致性和完整性).与此同时,拆得越细,查询的代价越高(需要更多耗时的连接运算). 2.关系模式的设计原则 如果表(集)主要用于数据更新(Online),表的分解就应该尽可能接近3NF, BCNF从前面的例子看没有必要,至于4NF.5NF更多属于理论研究领域,在实际应 用中无此必要. 如果

Rust 功能函数的关系、包和模块简介

Rust 功能函数的关系.包和模块简介 一.功能函数之间的关系 前面看到,一个文件中可以定义多个 function 功能函数,这些功能函数可以被相互使用.程序的入口是main(). 在一个文件中,各个功能函数的定义和使用不受功能函数定义的顺序约束.也就是说,不需要像 C 语言一样,在使用一个函数而还没有定义函数之前要有一个声明语句:而像 java 一样,只要声明的功能函数在一个文件内,可以忽略功能函数在文件中出现的顺序. 二.文件的包管理 当一个文件中的功能函数越来越多,阅读和修改都是个问题.因

ER 和 数据库关系模式

http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们眼下所接触的数据库基本上是关系数据库,关系数据库中的关系模式是型,而关系是值.关系模式是对关系的描写叙述. 什么是关系?关系实质上是一张二维表,当中每一行是一个元组,每一列是一个属性,每一个元组是该关系涉及到属性集合笛卡尔积的一个元素.(笛卡尔积是这种一个集合.集合中的元素是有序对,若A={0,1}B={a,b}则:A*B={<0,a>,<

数据库复习11——关系模式与范式

数据库复习 CH11 关系模式与范式 11.1 关系模式的设计 数据库模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,关系型数据库的模式又叫关系模式,我所理解的关系模式就是数据库中表结构的定义以及多张表之间的逻辑联系 关系模式的设计就是根据一个具体的应用,把现实世界中的关系用表的形式来表示的逻辑设计过程,不规范的关系模式设计会带来以下的问题: 数据冗余 更新异常 插入异常 删除异常 举ppt中例子说明四种问题,如下表中描述了老师信息(一个老师一个地址,可以教多门课,一门课只有一名老

E-R图向关系模式的转换

转自: http://hi.baidu.com/qicaiqinxian/blog/item/a8bb0bdf31ae081b63279887.html E-R图向关系模型转换时犯糊涂了,找到下面这篇文章, 话说的真别扭, 不过问题算是能解决了, E-R图向关系模式的转换要解决的问题是如何将实体型和实体间的联系转换为关系模式,如何确定这些关系模式的属性和码. 关系模型的逻辑结构是一组关系模式的集合.E-R图则是由实体型.实体的属性和实体型之间的联系3个要素组成.所以将E-R图转换为关系模型实际上