迁移外键与拉拉维尔中的雄辩关系

2022-08-30 12:58:55

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

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

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

我已经阅读了文档,但我仍然对以下内容感到困惑:

  1. 我需要同时使用两者还是只需要 1 个?

  2. 同时使用两者是错误的吗?还是使它变得多余或引起冲突?

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

  4. 有什么区别?

这些是我现在拥有的代码。我仍然不清楚我是否需要删除我在迁移文件中设置的外键。

迁移:

  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');
     }
}

有人可以帮我理解这一点吗?


答案 1

两者齐头并进。一个是完整的,没有另一个。如果你想让你的关系正常工作,你需要定义这两件事。

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

因此,只要您在其中一个模型中编写,并在另一个模型中编写相应的函数,只有这样您的模型才能相互了解,然后您就可以通过模型以及数据库中成功查询内容。hasMany

另请注意,如果通过模型和在模型中正确定义了关系,但尚未在模型中提供外键的模型谁的其他表,则您的关系将不起作用。hasManybelongsTobelongsTo

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


答案 2

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

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

文档


推荐