簡體   English   中英

Laravel:使用Eloquent ORM的N到N(mysql)關系

[英]Laravel: N to N (mysql) relation using Eloquent ORM

我有4張桌子:

// Table countries
+----+------+
| Id | Name |
+----+------+
|  1 | USA  |
|  2 | GB   |
+----+------+

// Table platforms
+----+---------+
| Id |  Name   |
+----+---------+
|  1 | Windows |
|  2 | Linux   |
+----+---------+

// Table users
+----+-------+------------+-------------+
| Id | Name  | country_id | platform_id |
+----+-------+------------+-------------+
|  1 | Admin |          1 |           1 |
|  2 | Test  |          2 |           1 |
+----+-------+------------+-------------+

// Table posts
+----+-----------+------------+-------------+---------+
| Id |   Title   | country_id | platform_id | user_id |
+----+-----------+------------+-------------+---------+
|  1 | TestPost1 |          2 |           1 | 1       |
|  2 | TestPost2 |          2 |           2 | null    |
+----+-----------+------------+-------------+---------+

數據庫應該能夠實現以下關系:

  • 用戶(N)< - >(N)平台
  • 用戶(N)< - >(N)國家
  • 用戶(0..1)< - >(N)發布
  • 郵政(N)< - >(N)國家
  • 發布(N)< - >(1)平台

所以現在我嘗試在Laravel Eloquent ORM文檔之后實現這些關系:

  // Country.php
  public function posts()
  {
      return $this->belongsToMany('App\Post');
  }

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

  // Platform.php
  public function users()
  {
      return $this->belongsToMany('App\User');
  }

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

  // User.php
  public function posts()
    {
        return $this->hasMany('App\Post');
    }

    public function countries()
    {
        return $this->hasMany('App\Country');
    }

    public function platforms()
    {
          return $this->hasMany('App\Platform');
    }

  // Post.php
  public function countries()
  {
      return $this->hasMany('App\Country');
  }

  public function platforms()
  {
      return $this->hasMany('App\Comment');
  }

  public function user()
  {
      return $this->belongsTo('App\User', 'user_id');
  }

但現在我很困惑,因為我認為在mysql中實現N到N關系的方法是向db添加第三個表,例如:

// Table CountryUserRelations to implement User (N) <-> (N) Country
+----+------------+---------+
| Id | country_id | user_id |
+----+------------+---------+
|  1 |          1 |       1 |
|  2 |          2 |       1 |
|  3 |          1 |       2 |
|  4 |          2 |       2 |
+----+------------+---------+

但是Eloquent ORM如何處理模型中的規則? 它是否會保持N到N的關系而不必添加關系表? 或者我錯過了什么或誤解了雄辯的ORM關系概念?

我剛加入stackoverflow,所以我沒有足夠的信用評論,所以我會在這里留下一個asnwer。

首先請糾正您的關系定義。

在用戶模型中:(你這里有錯誤)

public function countries(){
    return $this->belongsToMany(Country::class);
}

並在您的國家模型中:

public function users(){
    return $this->belongsToMany(User::class);
}

第二,你需要使用以下方法創建country_user表:

php artisan make:migration create_country_user_table

在它之后你需要完成你的表:

Schema::create('country_user', function (Blueprint $table){
    $table->increments('id');
    $table->unsignedInteger('country_id');
    $table->unsignedInteger('user_id');
    $table->foreign('country_id')->references('id')->on('countries');
    $table->foreign('user_id')->references('id')->on('users');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM