我正在将一个项目与一个仅基于应用程序的电子邮件系统放在一起。尝试做一些我不是100%确定的事情可以做到,但不知道解决方法。基本上,有没有一种方法可以让一个表中的3列从数据库中其他位置的同一表中提取数据?即:
public function up()
{
Schema::create('email', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->string('user_id'); //for the 'to' field column
$table->string('user_id'); //for the 'from' field column
$table->string('user_id'); //for the 'Cc' field column
$table->timestamps();
});
}
希望我的解释有意义。显然,user_id引用了用户表
答案 0 :(得分:1)
执行此操作的最佳方法是为每个列赋予唯一的名称:
public function up()
{
Schema::create('email', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->string('user_to_id'); //for the 'to' field column
$table->string('user_from_id'); //for the 'from' field column
$table->string('user_cc_id'); //for the 'Cc' field column
$table->timestamps();
});
}
然后,当您发送一封新电子邮件时,在EmailController.php中,您将使用类似以下内容:
public function store()
{
$email = new Email; // Email model
$email->user_to_id = $request->recipient_input
$email->user_from_id = $request->cc_input
$email->user_cc_id = Auth::user()->id; // Guessing that the from id is from a logged in person
$email->title = $request->title;
$email->body = $request->body;
$email->save();
}
类似的东西:)
答案 1 :(得分:0)
可能的,但是您必须为列指定不同的名称:
public function up()
{
Schema::create('email', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->string('user_to_id'); //for the 'to' field column
$table->string('user_from_id'); //for the 'from' field column
$table->string('user_cc_id'); //for the 'Cc' field column
$table->timestamps();
});
}
(我假设您的用户表具有字符串主键,并且故意将字符串作为字符串创建外键)
答案 2 :(得分:0)
您可以为这些列指定不同的名称,然后指定具有外键约束的引用。
此外,由于id
表中的users
主键可能是increments('id')
,因此您应将user_id_*
列设为unsignedInteger
。
迁移
public function up()
{
Schema::create('email', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->unsignedInteger('user_id_to');
$table->unsignedInteger('user_id_from');
$table->unsignedInteger('user_id_cc');
$table->timestamps();
$table->foreign('user_id_to')
->references('id')->on('users');
$table->foreign('user_id_from')
->references('id')->on('users');
$table->foreign('user_id_cc')
->references('id')->on('users');
});
}
电子邮件模型
class Email extends Model
{
protected $table = 'email';
public function to()
{
return $this->hasOne('App\User', 'user_id_to');
}
public function from()
{
return $this->hasOne('App\User', 'user_id_from');
}
public function cc()
{
return $this->hasOne('App\User', 'user_id_cc');
}
}
请参见Laravel Database Migration文档。
这可能超出了问题的范围,但是您可以做一些改进:
可以抄送1个以上的用户
邮件正文通常也可以为空,因此可以添加->nullable()
与您的CC相同,除非您的要求如此,否则您的CC应该为可空。