您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Laravel中的Many-To-Many

2025/3/2 10:36:33发布14次查看
在实际的开发中,我们经常会接触到几种常见的对应关系模式:
one-to-one //一对一one-to-many //一对多many-to-many //多对多
在刚刚开始接触到这些概念的时候,其实我是不太理解的。但是一旦你将这些概念应用到生活中,理解起来就很简单了,就举一个与我们在网上经常见到的例子:
user-to-profile // one-to-oneuser-to-articles // one-to-manyarticles-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); }
以上,就实现了在laravel中的many-to-many.
happy hacking
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product