PHP-扩展包雄辩模型

时间:2019-03-01 13:39:08

标签: php laravel

我使用一个名为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

我该怎么办,以便可以扩展包模型并添加关系?

2 个答案:

答案 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,其中包括最新的提交。

此问题已解决。