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