移植外键与Laravel中雄辩的关系

时间:2015-07-10 11:21:18

标签: php mysql laravel eloquent laravel-5

在Laravel 5.1中,我可以看到表列关系可以通过两种方式设置:

1)在迁移表中定义外键。

2)在模型中定义雄辩关系。

我已经阅读过这些文件,我仍然对以下内容感到困惑:

  1. 我需要同时使用两者吗?

  2. 同时使用两者是不对的?或者它是否成功 多余或引起冲突?

  3. 使用Eloquent关系而不提及的有什么好处 迁移列中的外键?

  4. 有什么区别?

  5. 这些是我现在的代码。如果我需要删除我在迁移文件中设置的外键,我仍然不清楚。

    迁移:

      public function up()
        {   
    
           Schema::create('apps', function (Blueprint $table) {
              $table->increments('id');
              $table->string('app_name');
              $table->string('app_alias');
              $table->timestamps();
              $table->engine = 'InnoDB';
           });
    
          // This is the second Migration table
          Schema::create('app_roles', function (Blueprint $table) {
              $table->increments('id');
              $table->integer('app_id')->unsigned()->index();
              $table->integer('user_id')->unsigned()->index();
              $table->integer('role_id')->unsigned()->index();
              $table->engine = 'InnoDB';
    
              $table->unique(array('app_id', 'user_id'));
    
              $table->foreign('app_id')
                    ->references('id')
                    ->on('apps')
                    ->onDelete('cascade');
    
              $table->foreign('user_id')
                    ->references('id')
                    ->on('users')
                    ->onDelete('cascade');
    
              $table->foreign('role_id')
                    ->references('id')
                    ->on('roles')
                    ->onDelete('cascade');
            });     
        }
    

    具有雄辩关系的模型:

    // App Model
    class App extends Model
    {
    
         public function appRoles() {
             return $this->hasMany('App\Models\AppRole');
         }
    }
    
    // AppRole Model
    class AppRole extends Model
    {
       public function app() {
           return $this->belongsTo('App\Models\App');
       }
    
       public function user() {
           return $this->belongsTo('App\User');
       }
    
       public function role() {
           return $this->belongsTo('App\Models\Role');
       }
    }
    
    // User Model
    class User extends Model implements AuthenticatableContract, CanResetPasswordContract
    {
        .....
        public function appRole() {
             return $this->belongsToMany('App\Models\AppRole');
         }
    }
    
    // Role Model
    class Role extends EntrustRole
    {
         public function appRole() {
             return $this->hasMany('App\Models\AppRole');
         }
    }
    

    有人可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:25)

两者齐头并进。一个是完整的而没有另一个。如果您希望关系正常工作,则需要定义这两种关系。

如果您刚刚在迁移文件中定义了外键,则只要您编写原始查询,该关系就会起作用。它不会对你的模型起作用,因为你还没有写过模型中关系的任何内容。

因此,只要您在其中一个模型中编写hasMany,并在另一个模型中编写相应的函数,只有您的模型才能相互了解,然后您才能通过模型​​成功查询事物在您的数据库中。

另请注意,如果您在模型中通过hasManybelongsTo正确定义了关系,但未在belongsTo其他模型的表格中提供外键表,你的关系不起作用。

简而言之,两者都是同等强制性的。

答案 1 :(得分:4)

Eloquent根据模型名称假定关系的外键。在这种情况下,App模型会自动假定具有app_id外键,因此在迁移中您无需指定:

$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');

Documentation