실제 개발에서 우리는 종종 몇 가지 일반적인 대응 패턴을 접하게 됩니다:
One-To-One //一对一 One-To-Many //一对多 Many-To-Many //多对多
처음 이러한 개념을 접하기 시작했을 때 사실 저는 전혀 몰랐습니다. 잘 이해가 안 가네요. 하지만 이러한 개념을 생활에 적용하면 이해하기가 매우 쉽습니다. 온라인에서 자주 볼 수 있는 예를 들어보겠습니다.
User-To-Profile // One-To-One User-To-Articles // One-To-Many Articles-To-Tags // Many-To-Many
번역:
- 한 명의 사용자는 하나의 사용자 프로필에 해당합니다.
- 한 명의 사용자는 여러 기사를 게시할 수 있습니다.
- 그리고 기사와 태그는 다대다 관계를 갖습니다. 하나의 기사는 여러 개의 태그를 가질 수 있으며, 하나의 태그는 여러 기사에 속할 수 있습니다.
이러한 관계 모델 중에서 구현하기 가장 어려운 것은 입니다. -다이것은 다대다 관계이지만 Laravel의 강력한 Eloquent
의 도움으로 이 기능을 구현하는 것이 비교적 원활합니다. Many-To-Many
这种多对多的关系,不过借助Laravel的强大的Eloquent
,实现这个功能还是比较顺心的。
1. 创建数据库表
创建articles
表
Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); });
创建tags
表
Schema::create('tags', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将article
和tag
联系起来,在Laravel中,如果你遵循官方的标准规则,第三张表应该是这样的:
表名 article_tag
Schema::create('article_tag', function(Blueprint $table) { $table->integer('article_id')->unsigned()->index(); $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); $table->integer('tag_id')->unsigned()->index(); $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); });
如果你没有按照官方的规范来,你需要在模型中指定外键。
2. 创建模型并指定关系
在Article.php
中:
<code><br> public function tags() { return $this->belongsToMany('App\Tag'); }</code>
在Tag.php
中:
public function articles() { return $this->belongsToMany('App\Article'); }
这里注意两点:
- 你可以在声明关系的时候指定外键,如
$this->belongsToMany('AppArticle','foreign_key', 'other_key');
- 如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:
return $this->belongsToMany('AppTag')->withTimestamps();
3. 在Controller
中使用
如果我们想查看某个文章含有哪些标签,我们可以这样:
$article = Article::find($id); dd($article->tags);
如果我们想通过某个标签来查找文章:
<code><br>public function showArticleByTagName($name) { $tag = Tag::where('value','=',$name)->first(); dd($tag->articles); }</code>
以上,就实现了在Laravel中的Many-To-Many
1. 데이터베이스 테이블 만들기
기사
테이블 만들기