PHP-Laravel高级关系

时间:2019-04-01 08:40:38

标签: php laravel

我有一个Web应用程序,用户可以在其中上传文档或向其发送入站电子邮件。所有文档和电子邮件都添加到我所谓的流中。请参阅以下设置:

Stream.php

public function documents()
{
    return $this->hasMany(Document::class);
}
public function emails()
{
    return $this->hasMany(Email::class);
}

逆关系已在Document.phpEmail.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_fielddocument_field

为允许使用变量(电子邮件字段或文档字段),我在下面的EmailFieldDocumentField中进行了定义:

    public function rules()
    {
        return $this->morphMany(FieldRule::class, 'fieldable');
    }

FieldRule.phpmorphTo的关系:

    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进行解析。但是在另一个流中,这些规则将不可用,因为用户必须向新流添加新规则。

0 个答案:

没有答案