翼度科技»论坛 编程开发 PHP 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
常见的对应关系模式

在实际的开发中,我们经常会接触到几种常见的对应关系模式:
  1. One-To-One //一对一
  2. One-To-Many //一对多
  3. Many-To-Many //多对多
复制代码
在刚刚开始接触到这些概念的时候,其实我是不太理解的。但是一旦你将这些概念应用到生活中,理解起来就很简单了,就举一个与我们在网上经常见到的例子:
  1. User-To-Profile // One-To-One
  2. User-To-Articles // One-To-Many
  3. Articles-To-Tags // Many-To-Many
复制代码
翻译过来就是:

  • 一个用户对应一个用户档案
  • 一个用户可以发表多篇文章
  • 而文章和标签确实多对多的关系,一篇文章可以有多个标签;一个标签可以属于多篇文章
在这些关系模型中,最难实现的就是
  1. Many-To-Many
复制代码
这种多对多的关系,不过借助Laravel的强大的
  1. Eloquent
复制代码
,实现这个功能还是比较顺心的。

1. 创建数据库表

创建
  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.         });
复制代码
创建
  1. tags
复制代码
  1. Schema::create('tags', function (Blueprint $table) {
  2.             $table->increments('id');
  3.             $table->string('name');
  4.             $table->timestamps();
  5.         });
复制代码
当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将
  1. article
复制代码
  1. tag
复制代码
联系起来,在Laravel中,如果你遵循官方的标准规则,第三张表应该是这样的:
表名
  1. 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. 创建模型并指定关系

  1. Article.php
复制代码
中:
  1. public function tags()
  2.     {
  3.         return $this->belongsToMany('App\Tag');
  4.     }
复制代码
  1. Tag.php
复制代码
中:
  1. public function articles()
  2.     {
  3.         return $this->belongsToMany('App\Article');
  4.     }
复制代码
这里注意两点:

  • 你可以在声明关系的时候指定外键,如
    1. $this->belongsToMany('App\Article','foreign_key', 'other_key');
    复制代码
  • 如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:
    1. return $this->belongsToMany('App\Tag')->withTimestamps();
    复制代码

3. 在Controller中使用

如果我们想查看某个文章含有哪些标签,我们可以这样:
  1. $article = Article::find($id);
  2. dd($article->tags);
复制代码
如果我们想通过某个标签来查找文章:
  1. public function showArticleByTagName($name)
  2.     {
  3.         $tag = Tag::where('value','=',$name)->first();
  4.         dd($tag->articles);
  5.     }
复制代码
以上,就实现了在Laravel中的
  1. Many-To-Many
复制代码
,更多关于Laravel 多对多关系模式的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/290552jbb.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具