PHP / Laravel - уникальные результаты для общих отношений - PullRequest
5 голосов
/ 20 апреля 2019

Я пытаюсь создать веб-приложение, в котором пользователи могут:

  1. Загрузить документы
  2. Загрузить электронные письма (входящие электронные письма)

Документы/ электронные письма будут загружены в то, что я называю «поток».Таким образом, в потоке может храниться много документов и много электронных писем.

Однако я также пытаюсь сделать так, чтобы мои пользователи могли анализировать содержимое документов и электронных писем в соответствии с набором правил синтаксического анализа.Пользователи могут создавать поля , которые могут иметь много правил синтаксического анализа.

Пример: Пользователь A загружает новый документ в поток под названием «Мои документы и электронные письма».Пользователь определил ниже два поля документа для этого потока:

  1. Ссылка заказа
  2. Номер отслеживания

Далее, естьнекоторые поля электронной почты , которые также были определены, , но не будут использоваться в этом случае, поскольку пользователь A в настоящее время загружает новый документ :

  1. From Name
  2. Email Subject

Все вышеприведенные поля также будут иметь некоторые правила синтаксического анализа, которые будут анализировать содержимое (это не показано в этом примере, так как оно не имеет значения).

Как видите, оба потока "Мои документы и электронные письма" имеют DocumentFields и EmailFields.

Это мои текущие настройки:

Stream.php

//A stream can have many document fields
public function documentfields()
{
    return $this->hasMany(DocumentField::class);
}
//A stream can have many email fields
public function emailfields()
{
    return $this->hasMany(EmailField::class);
}

Document.php (То же отношение доступно в Email.php)

//A document belongs to a Stream.
public function stream()
{
   return $this->belongsTo(Stream::class);
}

//Get the document fields available for the specific stream.
public function fields()
{
   return $this->stream->documentfields();
}

Теперь мой вопрос: как я могу сделать так, чтобы поля были "привязаны" к потоку?, но содержат уникальное значение для каждого Document или Email, которое загружается?

Что-то вроде:

document_fields:

id | stream_id          | name             
1  | 1                  | Order Reference 
2  | 1                  | Tracking Number 

document_field_results

id | document_field_id  | document_id  | content
1  | 1                  | 10           | Lorem Ipsum Dolar Amet for document #10    
2  | 2                  | 10           | Some other Lorem Ipsum Dolar Amet for document #10
3  | 1                  | 55           | Lorem Ipsum Dolar Amet for document #55       
4  | 2                  | 55           | Some other Lorem Ipsum Dolar Amet for document #55      

(та же логика при загрузке электронной почты / входящей электронной почты)

Таким образом, всякий раз, когда новый документ загружается в поток (id.1), он "наследуется""поля документа выше, но содержимое будет уникальным для каждого поля (поскольку каждый загруженный документ / электронное письмо в конечном итоге будет иметь разное содержимое).

Как будет выглядеть правильная настройка отношений в этом случае?И это правильный путь?

1 Ответ

1 голос
/ 25 апреля 2019

ИМХО.

streams: id, name

file_categories: id, name.Значения: документ и электронная почта.Это дает вам возможность добавлять новый тип загрузки файлов

uploads: id, file_category_id, stream_id ,name

upload_fields: id, stream_id, name

upload_upload_fields: id, upload_id, upload_field_id, content.

При такой настройке вам не нужно создавать модели для электронной почты и документов.Более того, вы можете легко добавить новую категорию загружаемых файлов.

Кстати, я некоторое время программировал, но только начал отвечать на SO вопросы.Я не знаю, как сделать структуру базы данных красивой, как в ваших вопросах.Не могли бы вы дать мне ссылку на этот формат?

Реализация

Я не уверен, как выглядит интерфейс.Поэтому я просто продолжаю свою интерпретацию

Stream.php:

public function uploadFields(){
    return $this->hasMany(UploadField::class);
}

Загрузка новых файлов

//First, get the uploadFields based on the stream_id
$uploadFields = Stream::with('uploadFields')->get();

//Second, insert the upload
$upload = new Upload(bla bla bla...); 
$upload->save();
//https://laravel.com/docs/5.8/eloquent#inserts
//Third, use the upload id to fill the upload_upload_fields, or if you prefer the result terms, that's okay
foreach($uploadFields as $field){
    UploadUploadField::insert(['upload_id' => $upload->id, 'upload_file_id' => $field->id, 'content' => 'The Lorem Ipsum, I guess this is from the request']);
}

Я думаю, что именно так я это и сделаю.Он будет немного отличаться, особенно для content, поскольку он сильно зависит от структуры request.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...