In actual development, we often come into contact with several common correspondence patterns:
One-To-One //一对一 One-To-Many //一对多 Many-To-Many //多对多
When I first came into contact with these concepts, I actually didn’t quite understand them. But once you apply these concepts to life, it's easy to understand. Let's take an example that we often see online:
User-To-Profile // One-To-One User-To-Articles // One-To-Many Articles-To-Tags // Many-To-Many
translates to:
- One user corresponds to one user profile
- A user can publish multiple articles
- There is a many-to-many relationship between articles and tags. An article can have multiple tags; a tag can belong to Multiple articles
Among these relationship models, the most difficult to implement is the many-to-many relationship Many-To-Many
, but with the help of Laravel’s powerful Eloquent
, it is quite satisfying to implement this function.
1. Create database table
Createarticles
table
Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); });
Createtags
table
Schema::create('tags', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
Of course , to solve this classic problem, these two tables alone are not enough. It is necessary to establish a relationship table in addition to these two tables to connect article
and tag
. In Laravel, if you follow the official standard rules, the third table should look like this:
Table namearticle_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'); });
If you do not follow the official specifications Now, you need to specify the foreign key in the model.
2. Create the model and specify the relationship
In Article.php
:
<code><br> public function tags() { return $this->belongsToMany('App\Tag'); }</code>
In Tag.php
:
public function articles() { return $this->belongsToMany('App\Article'); }
Note two points here:
- You can specify foreign keys when declaring the relationship, such as
$this->belongsToMany('App\Article',' foreign_key', 'other_key');
- If you add timestamps() in the article_tag table, that is, the two fields created_at and updated_at appear in the table, you need to do this when declaring the relationship in Article :
return $this->belongsToMany('App\Tag')->withTimestamps();
Controller
## If we want to check which tags an article contains, we can do this:
$article = Article::find($id); dd($article->tags);
If we want to find an article by a certain tag:
<code><br>public function showArticleByTagName($name) { $tag = Tag::where('value','=',$name)->first(); dd($tag->articles); }</code>
The above is achieved.
Many-To-Many. in Laravel