我使用一个名为Laravel Mailbox的软件包,该软件包用于将入站电子邮件提取到您的Laravel应用程序中。
此软件包中的base model如下所示:
class InboundEmail extends Model
{
protected $table = 'mailbox_inbound_emails';
protected $mimeMessage;
protected $fillable = [
'message',
];
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->message_id = $model->id();
});
}
....
....
}
因此,该程序包已经有一个定义的表:mailbox_inbound_emails
。现在,我想向该模型/表添加关系,因此我向表添加了一个自定义列,名为stream_token
。
此外,我正在通过使用自己的名为Email
的模型来扩展模型-这是为了避免直接修改包模型。
这是我的电子邮件模型:
class Email extends InboundEmail
{
protected $fillable = [
'stream_token',
];
public function __invoke(InboundEmail $email, $token)
{
// Handle the incoming email
return $this->stream();
}
/**
* An email belongs to a Stream.
*/
public function stream()
{
return $this->belongsTo(Stream::class, 'token');
}
}
在我的AppServiceProvider
的{{1}}方法中,我有这个:
boot()
因此,当我从例如myname@mydomain.com发送电子邮件时,public function boot()
{
Mailbox::from('{token}@mydomain.com', Email::class);
}
变量在我的$token
的{{1}}类中可用。
如果我这样做:
Email.php
它将输出:__invoke()
现在,执行上述操作时出现错误,因为它无法插入数据库。错误是:
public function __invoke(InboundEmail $email, $token)
{
Log::debug($token)
}
如您所见,在插入数据库时,它甚至都没有考虑myname
。
我该怎么办,以便可以扩展包模型并添加关系?
答案 0 :(得分:0)
您应将nullable
stream_token
归档到数据库中。没有默认值。
尝试将token
替换为stream_token
:
//instead of
return $this->belongsTo(Stream::class, 'token');
//do this:
return $this->belongsTo(Stream::class, 'stream_token');
此外,我将在此处提供foreg键作为第三个参数。
答案 1 :(得分:0)
因此,其原因实际上非常简单。当我通过运行composer require beyondcode/laravel-mailbox
提取软件包时,它没有提取最新的更改,因此没有使用我的自定义模型Email.php
。
我运行了composer require --dev beyondcode/laravel
,其中包括最新的提交。
此问题已解决。