Customize the MailTemplate model for multiple templates per mailable
mainThe default MailTemplate model supports a 1:1 relationship between a mailable and a template. To support multiple templates for the same mailable (e.g., based on a user group or category), you should:
- Publish the
mail_templatemigration. - Create a custom model that extends
\Spatie\MailTemplates\Models\MailTemplateand implementsMailTemplateInterface. - Override the
scopeForMailable()method to define how the correct template is fetched. - In your
TemplateMailableclass, set the$templateModelClassstatic property to your custom model.
Example: A MeetupMailTemplate that fetches a template based on a meetup_group_id provided by the mailable.
class MeetupMailTemplate extends MailTemplate implements MailTemplateInterface
{
public function scopeForMailable(Builder $query, Mailable $mailable): Builder
{
return $query
->where('mailable', get_class($mailable))
->where('meetup_group_id', $mailable->getMeetupGroupId());
}
}
class NewMeetupPlannedMail extends TemplateMailable
{
protected static $templateModelClass = MeetupMailTemplate::class;
public function getMeetupGroupId(): int
{
return $this->meetup->meetup_group_id;
}
}