当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel Many-To-Many多对多关系模式示例详解

发布:smiling 来源: PHP粉丝网  添加日期:2023-10-16 17:49:00 浏览: 评论:0 

常见的对应关系模式

在实际的开发中,我们经常会接触到几种常见的对应关系模式:

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

翻译过来就是:

一个用户对应一个用户档案

一个用户可以发表多篇文章

而文章和标签确实多对多的关系,一篇文章可以有多个标签;一个标签可以属于多篇文章。

在这些关系模型中,最难实现的就是Many-To-Many这种多对多的关系,不过借助Laravel的强大的Eloquent,实现这个功能还是比较顺心的。

1. 创建数据库表

创建articles表

  1. Schema::create('articles'function (Blueprint $table) { 
  2.             $table->increments('id'); 
  3.             $table->string('title'); 
  4.             $table->text('content'); 
  5.             $table->timestamps(); 
  6.         }); 

创建tags表

  1. Schema::create('tags'function (Blueprint $table) { 
  2.             $table->increments('id'); 
  3.             $table->string('name'); 
  4.             $table->timestamps(); 
  5.         }); 

当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将article和tag联系起来,在Laravel中,如果你遵循官方的标准规则,第三张表应该是这样的:

表名 article_tag

  1. Schema::create('article_tag'function(Blueprint $table) { 
  2.             $table->integer('article_id')->unsigned()->index(); 
  3.             $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); 
  4.             $table->integer('tag_id')->unsigned()->index(); 
  5.             $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); 
  6.         }); 

如果你没有按照官方的规范来,你需要在模型中指定外键。

2. 创建模型并指定关系

在Article.php中:

  1. public function tags() 
  2.     { 
  3.         return $this->belongsToMany('App\Tag'); 
  4.     } 

在Tag.php中:

  1. public function articles() 
  2.     { 
  3.         return $this->belongsToMany('App\Article'); 
  4.     } 

这里注意两点:

你可以在声明关系的时候指定外键,如$this->belongsToMany('App\Article','foreign_key', 'other_key');

如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:return $this->belongsToMany('App\Tag')->withTimestamps();

3. 在Controller中使用

如果我们想查看某个文章含有哪些标签,我们可以这样:

$article = Article::find($id);

dd($article->tags);

如果我们想通过某个标签来查找文章:

  1. public function showArticleByTagName($name
  2.     { 
  3.         $tag = Tag::where('value','=',$name)->first(); 
  4.         dd($tag->articles); 
  5.     }

Tags: Many-To-Many Laravel多对多关系

分享到: