>  기사  >  PHP 프레임워크  >  Laravel의 다대다에 대한 간략한 분석

Laravel의 다대다에 대한 간략한 분석

藏色散人
藏色散人앞으로
2021-07-02 14:21:491208검색

실제 개발에서 우리는 종종 몇 가지 일반적인 대응 패턴을 접하게 됩니다:

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

번역:

  1. 한 명의 사용자는 하나의 사용자 프로필에 해당합니다.
  2. 한 명의 사용자는 여러 기사를 게시할 수 있습니다.
  3. 그리고 기사와 태그는 다대다 관계를 갖습니다. 하나의 기사는 여러 개의 태그를 가질 수 있으며, 하나의 태그는 여러 기사에 속할 수 있습니다.

이러한 관계 모델 중에서 구현하기 가장 어려운 것은 입니다. -다이것은 다대다 관계이지만 Laravel의 강력한 Eloquent의 도움으로 이 기능을 구현하는 것이 비교적 원활합니다. 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();
        });

当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将articletag联系起来,在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中:

<code><br>    public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }</code>

Tag.php中:

public function articles()
    {
        return $this->belongsToMany('App\Article');
    }

这里注意两点:

  1. 你可以在声明关系的时候指定外键,如$this->belongsToMany('AppArticle','foreign_key', 'other_key');
  2. 如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:return $this->belongsToMany('AppTag')->withTimestamps();

3. 在Controller中使用

如果我们想查看某个文章含有哪些标签,我们可以这样:

$article = Article::find($id);

dd($article->tags);

如果我们想通过某个标签来查找文章:

<code><br>public function showArticleByTagName($name)
    {
        $tag = Tag::where('value','=',$name)->first();

        dd($tag->articles);
    }</code>

以上,就实现了在Laravel中的Many-To-Many

1. 데이터베이스 테이블 만들기

기사 테이블 만들기
rrreee🎜태그 테이블 만들기🎜rrreee🎜물론 이 고전적인 문제를 해결하려면 다음 사항이 필요합니다. 이 두 개의 테이블만으로는 충분하지 않습니다. Laravel에서 다음과 같이 하면 articletag를 연결하기 위해 이 두 테이블 외에 관계 테이블을 설정해야 합니다. 공식 표준 규칙에 따르면 세 번째 테이블은 다음과 같아야 합니다. 🎜🎜테이블 이름 article_tag🎜rrreee🎜공식 사양을 따르지 않는 경우 모델에 외래 키를 지정해야 합니다. 🎜

2. 모델 생성 및 관계 지정

🎜Article.php: 🎜rrreee🎜Tag.php: 🎜rrreee🎜참고 두 가지 점: 🎜🎜🎜관계를 선언할 때 외래 키를 지정할 수 있습니다(예: $this->belongsToMany('AppArticle','foreign_key', 'other_key');🎜🎜If in) Article_tag 테이블에 timestamps()를 추가했습니다. 즉, 테이블에 Create_at 및 selected_at 두 필드가 표시됩니다. Article에서 관계를 선언할 때 다음을 수행해야 합니다. return $this->belongsToMany('AppTag ')->withTimestamps ();🎜🎜

3. 컨트롤러

에서 사용됩니다🎜기사에 어떤 태그가 포함되어 있는지 확인하려면 다음을 수행하세요. :🎜rrreee🎜특정 태그로 기사를 찾으려면: 🎜rrreee🎜위는 Laravel에서 Many-To-Many를 구현합니다.🎜🎜

위 내용은 Laravel의 다대다에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제