当前位置: 首页 > 知识库问答 >
问题:

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

笪波鸿
2023-03-14

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

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

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

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

>

  • 我是需要同时使用这两个还是只需要1个?

    两者同时使用有错吗?还是让它变得多余或者引起冲突?

    使用有说服力的关系而不在迁移列中提及外键有什么好处?

    有什么区别?

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

    迁移:

      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个答案

    洪富
    2023-03-14
    $table->foreign('app_id')
    ->references('id')
    ->on('apps')
    ->onDelete('cascade');
    

    文档

    陆曜文
    2023-03-14

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

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

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

    还要注意,如果你已经通过在你的模型中的has很多属性到正确定义了关系,但是在模型的表中没有提供外键的属性到其他表,你的关系将不起作用。

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

     类似资料:
    • 这是通过使用包含以下内容的SQL转储移植旧项目来学习Laravel(特别是v5.x)的一种尝试: 在垃圾堆的底部有一个与此特定表格相关的: 来自一对stackoverflow问题1、2、3;我修改了原始代码,将Schema::table的外键从Schema::create中拆分出来,并将unsigned()添加到每个字段: 但在使用新创建的空DB进行迁移时,仍然会出现错误: 根据MySQL,这意味

    • 我试着补充: 并用调用,但响应为空。

    • 我有以下三个表格: 所以基本上这种关系就像: 用户有许多项目 项目属性到客户端 我的问题是: 如何使用eloquent获得用户的所有客户端? 似乎我不能用户hasManyPass方法,因为在客户端表中没有project_id。 因此,我希望达到的目标是:

    • 我正在编写php代码,对于当前的项目,我正在使用laravel框架(带有雄辩的ORM)。在这个项目中,我创建了两个表:用户和任务。我想在这些表之间创建一个“一对多”的关系。因此,一个用户可以有许多任务。在Tasks类中,我创建了方法所有者(): 但是当我以前得到用户名的时候 我得到这个异常:未定义的属性:illumb\Database\Eloquent\Relations\BelongsTo::$

    • 我有三种模式——博客、帖子、评论。博客有很多帖子,帖子有很多评论 当我写作时 它会给所有的博客发帖子和评论。但我将如何获得那些由管理员用户创建的博客,即评论表中的用户id。在哪里写入

    • 我是Laravel5.2的新手,正在开发一个遗留系统,对雄辩有点困惑,希望有人能给我代码。 共有3个表格: 卡片类别卡片2类 卡片可以是许多类别的一部分,这些类别保存在cards2cat表中。 cards2cat表的结构如下 id(主键)图像(卡)类别 我想做的是在Cards模型中有一个方法,名为getCardsWithCategors,它返回Cards信息和category表中类别的名称。 ca