• Laravel5.1 模型 --多对多关系


    多对多关系也是很常用的一种关系,比如一篇文章可以有多个标签,一个标签下也可以有多篇文章,这就是一个典型的多对多的关系。


     1 实现多对多关系

    多对多关系我们需要三张表,一张是文章另一张是标签,第三章表是它们的中间表 因为多对多关系需要抽离成两个一对多关系嘛。

     1.1 文章结构

        public function up()
        {
            Schema::create('articles', function (Blueprint $table) {
                $table->increments('id');
                $table->string('title');
                $table->text('body');
                $table->integer('comment_count')->default(0);
                $table->timestamps();
            });
        }

     1.2 标签结构

        public function up()
        {
            Schema::create('tags', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->text('content');
                $table->timestamps();
            });
        }

     1.3 中间表结构

        public function up()
        {
            Schema::create('article_tag', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('article_id');
                $table->integer('tag_id');
            });
        }

     2 编写关系

     2.1 Article

    首先我们看看文章模型中的方法:

        public function tags()
        {
            /**
             * (其实 我们只需要写第一个参数就OK了)
             * 第二个参数:中间表名 如果不是article_tag的话 必须指定该参数。
             * 第三个参数:外键 如果中间表中不是article_id 必须指定该参数。
             * 第四个参数:关联到那个外键 如果不是tag_id 必须指定该参数。
             */
            return $this->belongsToMany(Tag::class, 'article_tag', 'article_id', 'tag_id');
    //        return $this->belongsToMany(Tag::class, 'article_tag');
        }

    然后展示:

    Route::get('/', function () {
        $article = AppArticle::find(16);
        foreach ($article->tags as $tag) {
            echo $tag->name . " :  " . $tag->content;
            echo '<hr />';
        }
    });

     2.2 Tag

    Tag模型的编写跟Article模型一模一样。

        public function articles()
        {
            /**
             * 可以完全省略后面的参数。
             * return $this->belongsToMany(Article::class);
             */
            return $this->belongsToMany(Article::class, 'article_tag', 'tag_id', 'article_id');
        }

    展示:

    Route::get('/', function () {
        $tag = AppTag::find(7);
        foreach ($tag->articles as $article) {
            echo $article->title . " :  " . $article->body;
            echo '<hr />';
        }
    });
  • 相关阅读:
    vue自定义指令使用注意事项
    es6新增方法---实用
    webpack和gulp的区别
    OSI 5层协议,socket,从协议角度看网络通信
    网络通信流程
    数据相关的模块
    一些模块
    面向对象
    ATM作业
    XML模块增删改查基本操作
  • 原文地址:https://www.cnblogs.com/sun-kang/p/7554901.html
Copyright © 2020-2023  润新知