Laravel Eloquent—模型间关系(关联)

Eloquent是什么

Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了)。所谓 “对象”,就是本文所说的 “模型(Model)”;对象关系映射,即为模型间关系。中文文档: http://laravel-china.org/docs/eloquent#relationships

下面我们开始一个一个地学习。
一对一关系

顾名思义,这描述的是两个模型之间一对一的关系。这种关系是不需要中间表的。

假如我们有两个模型:User 和 Account,分别对应注册用户和消费者,他们是一对一的关系,那么如果我们要使用 Eloquent 提供的一对一关系方法,表结构应该是这样的:

user: id ... ... account_id

account: id ... ... user_id

假设我们需要在 User 模型中查询对应的 Account 表的信息,那么代码应该是这样的。 `/app/models/User.php`:

<?php

class User extends Eloquent {

protected $table = ‘users‘;

public function hasOneAccount()

{

return $this->hasOne(‘Account‘, ‘user_id‘, ‘id‘);

}

}

然后,当我们需要用到这种关系的时候,该如何使用呢?如下:

$account = User::find(10)->hasOneAccount;

此时得到的 `$account` 即为 `Account` 类的一个实例。

这里最难的地方在于后面的两个 foreign_key 和 local_key 的设置,大家可以就此记住:在 User 类中,无论 hasOne 谁,第二个参数都是 `user_id`,第三个参数一般都是 `id`。由于前面的 `find(10)` 已经锁定了 id = 10,所以这段函数对应的 SQL 为: `select * from account where user_id=10`。

这段代码除了展示了一对一关系该如何使用之外,还传达了三点信息,也是我对于大家使用 Eloquent 时候的建议:

1. 每一个 Model 中都指定表名

2. has one account 这样的关系写成 `hasOneAccount()` 而不是简单的 `account()`

3. 每次使用模型间关系的时候都写全参数,不要省略

相应的,如果使用 belongsTo() 关系,应该这么写:

<?php

class Account extends Eloquent {

protected $table = ‘accounts‘;

public function belongsToUser()

{

return $this->belongsTo(‘User‘, ‘user_id‘, ‘id‘);

}

}

一对多关系

学会了前面使用一对一关系的基础方法,后面的几种关系就简单多了。

我们引入一个新的Model:Pay,付款记录。表结构应该是这样的:

user: id ... ...

pay: id ... ... user_id

User 和 Pay 具有一对多关系,换句话说就是一个 User 可以有多个 Pay,这样的话,只在 Pay 表中存在一个 `user_id` 字段即可。 `/app/models/User.php`:

<?php

class User extends Eloquent {

protected $table = ‘users‘;

public function hasManyPays()

{

return $this->hasMany(‘Pay‘, ‘user_id‘, ‘id‘);

}

}

然后,当我们需要用到这种关系的时候,该如何使用呢?如下:

$accounts = User::find(10)->hasManyPays()->get();

此时得到的 `$accounts` 即为 `Illuminate\Database\Eloquent\Collection` 类的一个实例。大家应该也已经注意到了,这里不是简单的 `-> hasOneAccount` 而是 `->hasManyPays()->get()`,为什么呢?因为这里是 `hasMany`,操作的是一个对象集合。

相应的 belongsTo() 的用法跟上面一对一关系一样:

<?php

class Pay extends Eloquent {

protected $table = ‘pays‘;

public function belongsToUser()

{

return $this->belongsTo(‘User‘, ‘user_id‘, ‘id‘);

}

}

多对多关系

多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了。

我们定义两个模型:Article 和 Tag,分别表示文章和标签,他们是多对多的关系。表结构应该是这样的:

article: id ... ...

tag: id ... ...

article_tag: article_id tag_id

在 Model 中使用:

<?php

class Tag extends Eloquent {

protected $table = ‘tags‘;

public function belongsToManyArticle()

{

return $this->belongsToMany(‘Article‘, ‘article_tag‘, ‘tag_id‘, ‘article_id‘);

}

}

需要注意的是,第三个参数是本类的 id,第四个参数是第一个参数那个类的 id。

使用跟 hasMany 一样:

$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();

这里会得到一个非常复杂的对象,可以自行 `var_dump()`。跟大家说一个诀窍,`var_dump()` 以后,用 Chrome 右键 “查看源代码”,就可以看到非常整齐的对象/数组展开了。

在这里给大家展示一个少见用法(奇技淫巧):

public function parent_video()

{

return $this->belongsToMany($this, ‘video_hierarchy‘, ‘video_id‘, ‘video_parent_id‘);

}

public function children_video()

{

return $this->belongsToMany($this, ‘video_hierarchy‘, ‘video_parent_id‘, ‘video_id‘);

}

对,你没有看错,可以 belongsToMany 自己。

时间: 2024-11-10 04:36:40

Laravel Eloquent—模型间关系(关联)的相关文章

深入理解 Laravel Eloquent(三)——模型间关系(关联)

Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了).所谓 "对象",就是本文所说的 "模型(Model)":对象关系映射,即为模型间关系.中文文档: http://laravel-china.org/docs/eloquent#relationships 下

判断Laravel Eloquent获取数据结果集是否为空

在使用Laravel Eloquent模型时,我们可能要判断取出的结果集是否为空,但我们发现直接使用is_null或empty是无法判段它结果集是否为空的. var_dump之后我们很容易发现,即使取到的空结果集, Eloquent仍然会返回Illuminate\Database\Eloquent\Collection对象实例.其实,Eloquent已经给我们封装几个判断方法. $result = Model::where(...)->get(); //不为空则 if ($result->fi

Laravel Eloquent 判断取出的结果集是否为空

在使用Laravel Eloquent模型时,我们可能要判断取出的结果集是否为空,但我们发现直接使用is_null或empty是无法判段它结果集是否为空的. var_dump之后我们很容易发现,即使取到的空结果集, Eloquent仍然会返回Illuminate\Database\Eloquent\Collection对象实例.其实,Eloquent已经给我们封装几个判断方法. $result = Model::where(...)->get(); //不为空则 if ($result->fi

Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化

在写api的时候,数据一般是以json格式进行传输的,没有对象可以直接使用.这个时候,对数据的序列化转换就很重要,Eloquent提供了很方便的方法和约定,不仅可以转换,还可以控制里面的键值. 基本用法 将模型转化为数组 $user = App\User::with('roles')->first(); return $user->toArray(); 把一个模型转化成数组: $users = App\User::all(); return $users->toArray(); 把col

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理,在 Laravel Administrator(后台扩展包) 您的数据库可能是彼此相关的.比如,一篇博客文章可能有许多评论,或者一个订单与下订单的用户相关.Eloquent 使得管理和处理这些关系变得简单.Laravel 提供了四种类型的关系: -一对一 -一对多 - 多对多 - 多态关系 一对多 一个一对多关系的例子是一篇博客文章有许多评

【laravel】Eloquent 模型事件和监听方式

所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creating 插入到数据库前触发 created 插入到数据库后触发 updating 更新到数据库前触发 updated 更新到数据库后触发 saving 保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发) saved 保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发) deleti

laravel Eloquent操作

基本用法 我们先从建立一个 Eloquent 模型开始.模型通常放在 app 目录下,但是您可以将它们放在任何地方,只要能通过 composer.json 自动载入.所有的 Eloquent 模型都继承于Illuminate\Database\Eloquent\Model . 定义一个 Eloquent 模型 class User extends Model {} 你也可以通过 make:model 命令自动生成 Eloquent 模型: php artisan make:model User

Laravel Eloquent ORM--整理

介绍 Laravel 的 Eloquent ORM 提供了漂亮.简洁的 ActiveRecord 实现来和数据库的互动. 每个数据库表会和一个对应的「模型」互动. 在开始之前,记得把 config/database.php 里的数据库连接配置好. 基本用法 我们先从建立一个 Eloquent 模型开始.模型通常放在 app 目录下,但是您可以将它们放在任何地方,只要能通过 composer.json 自动载入.所有的 Eloquent 模型都继承于 Illuminate\Database\Elo

Laravel Eloquent使用小记

文章保存地址:https://github.com/wanguowan/notetext-blog/blob/master/Eloquent.md Laravel Eloquent使用小记 今天因为开发数据库业务中间层需要,开始研究Laravel Eloquent,因为刚开始使用laravel框架的时候,都是使用query,查询构建器来写sql类似于 DB::connection('mydb')->table('mylove') ->where( 'name', 'guowan' ) ->