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();//实例化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();
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();
$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();  

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();
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();
if(is_null($course))
{
echo "该课程不存在!"
exit;
}
$new_student = array(
'name' => '沖田杏梨';
); $course->students()->insert($new_student);

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

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

    转自: http://hi.baidu.com/qicaiqinxian/blog/item/a8bb0bdf31ae081b63279887.html E-R图向关系模型转换时犯糊涂了,找到下面这篇 ...

  2. 如何将ER图转换成关系模式集

    在ER图中,主要是实体类型和联系类型. 1.实体类型的转换 (“——”表示对应关系) 实体类型——关系模式 实体的属性——关系模式的属性 实体标识符——关系模式的键 2.联系的转换 一元联系较简单,三 ...

  3. ER 和 数据库关系模式

    http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们眼下所接触的数据库基本上是关系数据库,关系数据库 ...

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

    1.找出条件中的实体(矩形),属性(椭圆),关系(菱形)关系分为1:1,1:N,M:N,列出ER图 2. -1:1联系的转换方法 -两个实体分别转化为一个关系模式,属性即是本来的属性 -关系可以与任意 ...

  5. 关系、关系模式、关系模型blablabla...

    好久没碰<数据库系统概论>了,最近翻了翻发现好多专业名词都忘记了, 现在有空特地记录下. 名词解释 数据:数据就是数据库中存储的基本数据,比如学生的学号.学生的班级数据库:存放数据的仓库数 ...

  6. UML类图关系模式(C++代码说明)

    在UML类图中的关系模式主要有以下几种: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 依赖(Depe ...

  7. 【例3】设有关系模式R(A, B, C, D, E)与它的函数依赖集F={A→BC, CD→E, B→D, E→A},求R的所有候选键。 解题思路:

    通过分析F发现,其所有的属性A.B.C.D.E都是LR类属性,没有L类.R类.N类属性. 因此,先从这些属性中依次取出一个属性,分别求它们的闭包:=ABCDE,=BD,=C,=D, =ABCDE.由于 ...

  8. 关系模式范式分解教程 3NF与BCNF口诀

    https://blog.csdn.net/sumaliqinghua/article/details/86246762 [通俗易懂]关系模式范式分解教程 3NF与BCNF口诀!小白也能看懂原创置顶 ...

  9. Laravel 5 基础(十一)- Eloquent 关系

    一个用户可能有多个文章,一个文章是某个用户书写的,这就是关系.同样文章中可能包含多个 TAG,而一个 TAG 可能关联多个文章. 在项目中,我们已经有了 User.php,也就是用户模型,查看一下,相 ...

随机推荐

  1. [moka同学笔记]使用composer 安装yii2以及遇到的问题

    [一.Yii2安装过程] 使用composer安装,composer安装请参考其他博客 1.下载 Yii2 高级模板 跟普通模板一样 , 可以通过 Composer 和 github 下载 ,不过官方 ...

  2. java中抽象、分装、继承和多态的理解

    1.抽象.封装装.继承和多态是java面向对象编程的几大特点. 抽象:所谓抽象就是对某件事务,我们忽略我们不关心不需要的部分,提取我们想要的属性和行为,并且以代码的形式提现出来:例如我们需要对一个学生 ...

  3. Jenkins在Windows系统dotnet平台持续集成

            之前写过一篇文章是在CentOS上构建.net自动化编译环境, 今天这篇是针对于Windows平台的环境.        Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平 ...

  4. Lind.DDD~实体属性变更追踪器的实现

    回到目录 看着这个标题很复杂,大叔把它拆开说一下,实体属性-变更-追踪器,把它拆成三部分大家看起来就容易懂一些了,实体属性:领域实体里有自己的属性,属性有getter,setter块,用来返回和设置属 ...

  5. 转:什么是即时编译(JIT)!?OpenJDK HotSpot VM剖析

    重点 应用程序可以选择一个适当的即时编译器来进行接近机器级的性能优化. 分层编译由五层编译构成. 分层编译提供了极好的启动性能,并指导编译的下一层编译器提供高性能优化. 提供即时编译相关诊断信息的JV ...

  6. svg.js教程及使用手册详解(一)

    做毕设的时候,因为要使用到画图和自定义动画,所以接触到了SVG.网上关于SVG和Canvas的对比很多,具体的辨析这里就不赘言.网上关于SVG的所谓教程基本上都是SVG本身,但是却没有一个针对svg. ...

  7. jgGrid中的editrules使用函数来进行验证

    jgGrid中的editrules 用于设置一些用于可编辑列的colModel的额外属性,大多数的时候是用来在提交到服务器之前验证用户的输入合法性的.比如editrules:{edithidden:t ...

  8. 巧用CSS实现分隔线

    下面是几种简单实现分隔线的方法,个人比较喜欢第二种,我也给出了最后第五种比较2的写法,请大家拍砖,或者提供其他好的方法. 单个标签实现分隔线: 点此查看实例展示 .demo_line_01{ padd ...

  9. 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法

    这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...

  10. .NET破解之百度云盘分享工具(批量)

    似曾相识 百度云盘分享工具一款专门用于自动批量分享百度云文件的软件.其原理完全模拟在网页上登录百度云盘,模拟手工点击,将分享的"公共链接"或"私密链接"保存起来 ...