php – 如何在Laravel 5.2中使用多对多的多态关系

我正在阅读laravel 5.2 docs以在我的Laravel应用程序中实现多对多的多态关系.
我有许多模型,如博客,问题,照片等,我想要所有的标签系统.
我用以下模式创建了Tag表
Schema::create('tags',function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('slug')->unique();
        $table->timestamps();
    });

下面是数据透视表模式.数据透视表名称为entity_tags

Schema::create('entity_tags',function (Blueprint $table) {
     $table->increments('id');
     $table->integer('tag_id')->unsigned();;
     $table->integer('taggable_id')->unsigned();
     $table->string('taggable_type');
     $table->timestamps();
     $table->index('tag_id');
     $table->index('taggable_id');
     $table->index('taggable_type');
});

这是在问题模型的标签模型中定义的关系

public function questions()
{
    return $this->belongsToMany('App\Question','entity_tags','tag_id','taggable_id');
}

并且在问题模型中定义了以下关系

public function tags()
{
    return $this->belongsToMany('App\Tag','taggable_id','tag_id');
}

现在我想定义Laravel 5.2中定义的Many to Many Polymorphic关系.
我的问题是

>我如何定义它们?
>我应该删除多对多
关系并且只定义多对多的多态关系?
如果是,那么如何管理自定义数据透视表名称?
>还需要将列名称后缀作为其中一部分的单词
多态关系?

>使用return $this-> morphToMany()而不是belongsToMany,并在Tag模型中,使用返回$this-> morphedByMany()为反向关系编写3个方法.
>您只需要多态定义,不需要多对多的正常定义.数据透视表的名称在默认约定的末尾带有’able’,但您可以将其命名为任何所需名称.
>不,你最后不必在’able’中找到一个单词,这只是一种定义它更通用的方法,你可以将它命名为你想要的任何东西.

命名基于Laravel的一些默认约定.

更新:

您有以下数据透视表模式:

Schema::create('entity_tags',function (Blueprint $table) {
        $table->increments('id');
        $table->integer('tag_id')->unsigned();;
        $table->integer('entity_id')->unsigned();
        $table->string('entity_type');
        $table->timestamps();
        $table->index('tag_id');
        $table->index('entity_id');
        $table->index('entity_type');
});

和标签表:

Schema::create('tags',function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('slug')->unique();
    $table->timestamps();
});

因此,您希望为博客,视频和问题表/模型创建关系:

Tag.php型号:

public function questions()
{
    return $this->morphedByMany('App\Question','entity','entity_tags');
}

public function blogs()
{
    return $this->morphedByMany('App\Blog','entity_tags');
}

public function videos()
{
    return $this->morphedByMany('App\Video','entity_tags');
}

Question.php / Blog.php / Video.php

public function tags()
{
    return $this->morphToMany('App\Tag','entity_tags');
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


laravel的dd函数不生效怎么办
看不懂laravel文档咋办
安装laravel框架出现command怎么办
Laravel开发API怎么使用事务
laravel怎么构建复杂查询条件
laravel如何实现防止被下载
为什么laravel比yii火
一些常见的Laravel定时任务不运行的问题
laravel用路由有什么好处
composer无法安装laravel怎么办
laravel现在还用吗
laravel怎么替换主键id
laravel的appurl有什么用
如何修改Laravel的报错输出形式
laravel怎么避免foreach查表
laravel怎样操作数据库
laravel怎么截取字符串
laravel 是国内的吗
laravel怎么设置请求头
浅析Laravel社区Redis组件报错的问题和解决方法