我有一个Web应用程序,用户可以在其中上传文档或向其发送入站电子邮件。所有文档和电子邮件都添加到我所谓的流中。请参阅以下设置:
Stream.php
public function documents()
{
return $this->hasMany(Document::class);
}
public function emails()
{
return $this->hasMany(Email::class);
}
逆关系已在Document.php
和Email.php
中定义。
现在,我的用户可以为文档和电子邮件设置自定义“字段”。 流中所有文档的所有字段都将相同。电子邮件也是如此。我创建了以下两种模型:
DocumentField.php
EmailField.php
关系在Stream.php
中定义:
Stream.php
public function documentfields()
{
return $this->hasMany(DocumentField::class);
}
public function emailfields()
{
return $this->hasMany(EmailField::class);
}
现在,所有字段可以附加不同的规则。一个字段可以附加许多规则,并且一个规则可以引用email_field
或document_field
。
为允许使用变量(电子邮件字段或文档字段),我在下面的EmailField
和DocumentField
中进行了定义:
public function rules()
{
return $this->morphMany(FieldRule::class, 'fieldable');
}
与FieldRule.php
有morphTo
的关系:
public function fieldable()
{
return $this->morphTo();
}
似乎我丢失了一些东西,因为我不知道如何访问上传到流中的每个文档或电子邮件的规则。
例如,我想要类似的东西:
public function parseDocument(Stream $stream, Document $document)
{
//Get the document fields available on this stream.
$rules = $stream->documentfields->rules;
$text = document->text;
foreach($rules as $rule)
{
//Do something with rule (specific for document fields on this stream).
}
}
public function parseEmail(Stream $stream, Document $document)
{
//Get the email fields available on this stream.
$rules = $stream->documentfields->rules;
$text = $email->text;
foreach($rules as $rule)
{
//Do something with rule (specific for email fields on this stream).
}
}
有些规则只能添加到email_fields
,而某些规则只能添加到document_fields
。此外,所应用的每个规则都针对它们分配给的特定字段。
例如,添加到Stream #1
的所有文档应根据规则:1,4和5进行解析。但是在另一个流中,这些规则将不可用,因为用户必须向新流添加新规则。