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();

results matching ""

    No results matching ""