码迷,mamicode.com
首页 > 其他好文 > 详细

Laravel五大功能之Eloquent关系模式

时间:2017-03-03 10:48:33      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:表之间   orm   而且   user   运动员   实例   方法   insert   htm   

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);  
技术分享

Laravel五大功能之Eloquent关系模式

标签:表之间   orm   而且   user   运动员   实例   方法   insert   htm   

原文地址:http://www.cnblogs.com/huilixieqi/p/6495111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!