Toggle Navigation
首页
Golang
PHP
Laravel
Magento
Linux
数据库
MySQL
Redis
Mongodb
热门知识
程序与生活
架构师之路
静态站点
GitHub
主页
Laravel Eloquent模型间关系
Laravel Eloquent模型间关系
01-23
Mark
906
###Eloquent### Eloquent 是一个ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”。所谓 “对象”,就是本文所说的 “模型(Model)”;对象关系映射,即为模型间关系。 ###一对一关系:### 顾名思义,这描述的是两个模型之间一对一的关系。这种关系是不需要中间表的。 假如我们有两个模型:Article和Author,分别对应文章和作者,他们是一对一的关系,那么如果我们要使用 Eloquent 提供的一对一关系方法,表结构应该是这样的: ``` article: id ... ... author_id author: id ... ``` 假设我们需要在Articl 模型中查询对应的Author表的信息,那么代码应该是这样的。 `/app/models/Article.php`: ``` <?php class Article extends Eloquent { protected $table = 'articles'; public function author(){ return $this->hasOne('App\Author', 'id', 'author_id'); } } ``` 然后,当我们需要用到这种关系的时候如下: ``` $author = Article::find(1)->author; ``` 此时得到的 `$author` 即为 `Author` 类的一个实例。 ###一对多关系:### 我们引入一个新的Model:Category,文章标签。表结构应该是这样的: ``` category: id ... ... article: id ... ... category_id ``` Category和Article具有一对多关系,换句话说就是一个Category可以有多个Article,这样的话,只在Article表中存在一个 `category_id` 字段即可。 `/app/models/Category.php`: ``` <?php class Category extends Eloquent { protected $table = 'categorys'; public function articles(){ return $this->hasMany('App\Article', 'category_id', 'id'); } } ``` 然后,当我们需要用到这种关系的时候如下: ``` $articles = Category::with(['articles'])->find(1); ``` 如果只需要获取Article的数量则可用,对应的字段为articles_count: ``` $article = Category::withCount('articles')->find(1); ``` ###多对多关系:### 多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了。 我们定义两个模型:Article和Tag,分别表示文章和标签,他们是多对多的关系。表结构应该是这样的: ``` article: id ... ... tag: id ... ... article_tag: article_id tag_id ``` 在 Model 中使用: ``` <?php class Article extends Eloquent { protected $table = 'articles'; public function tags(){ return $this->hasMany('App\Tag', 'article_tag', 'article_id', 'tag_id'); } } ``` ``` <?php class Tag extends Eloquent { protected $table = 'tags'; public function articles(){ return $this->hasMany('App\Article', 'article_tag', 'tag_id', 'article_id'); } } ``` 需要注意的是,第三个参数是本类的id,第四个参数是第一个参数那个类的id,使用跟hasMany一样: ``` $articles = Article::with(['tags'])->get(); ``` 如果只需要获取tag的数量则可用,对应的字段为tags_count: ``` $articles = Article::withCount('tags')->get(); ```
最新文章
Golang内存问题处理
WebSocket详解
Gopher面试中的Coding(三)
Golang用os/signal包实现平滑重载配置文件
Nginx实现负载均衡的几种方式
Golang中子goroutine与主协程同步的四种实现
Dockerfile文件详解
Golang开发微信公众号
最热文章
Magento实现下载csv数据表格
1815
Laravel带有条件搜索的分页
1716
Magento上传文件、缩略图和导出CSV
1705
Magento添加Advanced Dataflow
1655
Golang开发微信公众号
1590
Magento后台添加rule规则
1560
Magento优化 – MySQL读写分离
1525
Magento常用模块分享
1419
热门标签
下载
laravel分页
上传
导出
Dataflow
微信公众号
rule
规则
读写分离
模块
shell
正则
Collection
binlog
命名空间
内存泄漏
处理
Git
string
解锁
锁表
composer
事务处理
函数
redis sentinel
time
架构
系统
package
读写
事务处理
缓存
日志分析
进阶
golang
表分割
schedule
fmt
事务
分布式锁
交叉编译
HTTPS
日志分割
Gopher面试
Dockerfile
channel
mongodb
git服务器
gogs
多数据库
重载配置
负载均衡
日志过滤
php
protobuf
发展方向
版本号
模型关系
goroutine
concat
json
mongodb
get
post
defer
panic
golang算法
docker
elasticsearch
算法
代码部署
rpc
redis
写文件
protobuf
主从配置
websocket
laravel
package
并发
量级
curl
生成插件
直接下载
数据类型
Shell
错误传递
grpc
成长
Go指针
参数
protobuf
队列
方法
Redis持久化
路上
风景
yum