Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel数据库迁移用户可能来自其他类型_Php_Database_Laravel_Model_Migration - Fatal编程技术网

Php Laravel数据库迁移用户可能来自其他类型

Php Laravel数据库迁移用户可能来自其他类型,php,database,laravel,model,migration,Php,Database,Laravel,Model,Migration,我目前面临着一个关于我项目构思部分的问题。 我读了很多帖子,没有人放弃这个问题。 我正在使用Laravel5.6作为我的web应用程序的API 所以我有两种类型的用户: 简单用户 专业用户 “专业”的人有一个仪表盘,在那里他可以做很多事情,“简单用户”可以联系“专业人士” 但“专业人士”也可以是“简单用户”,他可以联系其他“专业人士”。这就是我在数据库的模型和迁移概念上遇到的问题。我不知道如何链接它们,我不想复制“Professional”表中的所有“Simple user”变量,而只是在这个表

我目前面临着一个关于我项目构思部分的问题。 我读了很多帖子,没有人放弃这个问题。 我正在使用Laravel5.6作为我的web应用程序的API

所以我有两种类型的用户:

  • 简单用户
  • 专业用户
  • “专业”的人有一个仪表盘,在那里他可以做很多事情,“简单用户”可以联系“专业人士”

    但“专业人士”也可以是“简单用户”,他可以联系其他“专业人士”。这就是我在数据库的模型和迁移概念上遇到的问题。我不知道如何链接它们,我不想复制“Professional”表中的所有“Simple user”变量,而只是在这个表中添加变量。(不知道是否是明确的)

    因此,我从创建用户模型/迁移开始:

    App/User.php

    数据库/migrations/.create_users_table.php

    专业模型/迁移:

    App/Professional.php

    名称空间应用程序

    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class Professional extends Authenticatable
    {
        use Notifiable;
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'profession', 'organisation', 'subscription', 'activity_start_at', 'valid_num_organisation'
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'user_id', 'num_organisation'
        ];
    
        /**
         * The attributes that should be handled by Carbon
         *
         * @var array
         */
        protected $dates = [
            'created_at',
            'updated_at',
            'deleted_at',
            'activity_start_at'
        ];
    
    }
    
    数据库/migrations/.create_professionals_table.php

    真正的问题是,什么是将用户和专业人士联系起来的最佳方式?像“user->isOneOf()”或类似的东西。

    我在考虑在我的用户上创建一个角色,如果角色为空,那么用户就是“简单用户”,如果不是专业用户,那么我认为这不是最好的方法

    我也看了多态链接,但我不认为这是我在这种情况下需要的

    如果你有什么想法,我在听


    谢谢。

    首先,感谢您对问题的详细描述。不是每个人都这样做

    当然,这个答案大部分是基于观点的。有许多不同的方法来实现这种行为。但是我认为应该讨论这个问题的“正确”实现,因为有很多开发人员真的不知道从哪里开始讨论这个话题。我很乐意接受任何反馈或补充我的答案,使之更完整

    所以。大多数时候,当我必须处理同一实体的多个类型/变体时,我只使用一个表。尤其是在处理身份验证时。因为这使得编写Laravel应用程序更加容易

    如果只有两种不同类型的实体。(您是普通用户和专业用户),我只是在
    users
    表上添加了
    is\u professional
    布尔标志。这就足够了

    当您想使用更多不同的变体时,我会在表中添加一个
    role
    列。如果需要存储特定于角色的数据,可以使用
    role\u id
    整数来引用单独的
    roles
    表。但大多数情况下,您只需使用
    varchar
    role键就可以成功。您也可以使用
    enum
    进行此操作,但我从不这样做。以后迁移表时,我总是遇到问题。不知道他们是否已经解决了这些问题

    users
    表中存储只针对特定类型的用户填写的额外数据并不丢脸。在您的情况下,这将是
    专业
    组织
    列。在某些情况下,可以接受非规范化。这完全取决于数据的大小和用途

    如果非规范化不是应用程序的方法。您还可以为您案例中的
    专业用户
    创建一个单独的表格,用于任何其他信息。您应该编写一些逻辑,确保可以为您的模型加载附加信息。可能在
    boot
    方法中。或者可能作为一个整体

    如果你愿意的话。您还可以为两个用户创建完全不同的身份验证系统。登录时分离逻辑。但是,当您这样做时,您必须选择哪个用户可以访问某个页面。我认为这两种类型的用户都很难实现可访问性


    正如我所说,对于您的问题,没有一般理想的实现。要回答你的问题,我必须从上到下了解你的申请。只有开发者,你;),能够形成最佳的战术。也许这不是你想要的答案,但这是我能给出的最好的答案。

    首先,感谢你的详细回答和所有这些非常有用的链接。在与团队讨论后,我们都同意继续使用
    is\u professional
    解决方案。我还将介绍
    professional\u user
    解决方案,并了解在这种情况下如何处理范围(我不知道它是如何工作的)。我认为这是一个很好的讨论主题,如果有其他的观点,它可能会很好。谢谢
    class CreateUsersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->increments('id');
                $table->string('email')->unique();
                $table->string('password');
                $table->string('old_password');
                $table->string('phone_number', 50);
                $table->string('last_name');
                $table->string('first_name');
                $table->tinyInteger('sex');
                $table->date('birthday');
                $table->text('address');
                $table->string('postal_code', 10);
                $table->string('city', 50);
                $table->string('country', 50);
                $table->boolean('valid_email')->default(false);
    
                $table->timestamps();
                $table->rememberToken();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('users');
        }
    }
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class Professional extends Authenticatable
    {
        use Notifiable;
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'profession', 'organisation', 'subscription', 'activity_start_at', 'valid_num_organisation'
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'user_id', 'num_organisation'
        ];
    
        /**
         * The attributes that should be handled by Carbon
         *
         * @var array
         */
        protected $dates = [
            'created_at',
            'updated_at',
            'deleted_at',
            'activity_start_at'
        ];
    
    }
    
    class CreateProfessionalsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('professionals', function (Blueprint $table) {
                $table->integer('user_id')->unsigned();
                $table->primary('user_id');
                $table->foreign('user_id')->references('id')->on('users');
                $table->string('profession');
                $table->string('organisation');
                $table->string('num_organisation');
                $table->string('subscription');
                $table->date('activity_start_at');
                $table->boolean('valid_num_organisation')->default(false);
                $table->timestamps();
    
                $table->foreign('user_id')
                    ->references('id')->on('users')->onDelete('set null');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::table('professionals', function (Blueprint $table) {
                $table->dropForeign('professionals_user_id_foreign');
                $table->dropColumn('user_id');
            });
            Schema::dropIfExists('professionals');
        }
    }