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表
- 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中:
- public function tags()
- {
- return $this->belongsToMany('App\Tag');
- }
在Tag.php中:
- public function articles()
- {
- return $this->belongsToMany('App\Article');
- }
这里注意两点:
你可以在声明关系的时候指定外键,如$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);
如果我们想通过某个标签来查找文章:
- public function showArticleByTagName($name)
- {
- $tag = Tag::where('value','=',$name)->first();
- dd($tag->articles);
- }
Tags: Many-To-Many Laravel多对多关系
- 上一篇:Laravel中ServiceProvider使用场景示例详解
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)