PHP - Сохранение отношений - общие и уникальные ссылки - PullRequest
0 голосов
/ 25 апреля 2019

У меня 4 модели:

  1. Поток
  2. поле * 1006
  3. Документ
  4. Результат

Тогда у меня определены следующие отношения:

Stream.php:

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

Field.php:

public function stream()
{
  return $this->belongsTo(Stream::class);
}

public function result()
{
  return $this->hasOne(Result::class);
}

Document.php

public function stream()
{
  return $this->belongsTo(Stream::class);
}

Result.php

public function field()
{
  return $this->hasOne(Field::class);
}

Теперь мои пользователи могут загружать документы в поток, а мои пользователи могут создавать множество полей в потоке.

Когда документ загружается в поток, для каждого определенного поля содержимое документа будет анализироваться в соответствии с некоторой логикой, которую я создал.

Конечный результат этого анализа должен быть сохранен в базе данных (results).

Я могу сделать это сейчас:

$document = Document::find(1);

foreach($stream->fields as $field)
{
    $content = myParseFunction($document->content);

    $field->save(['content' => $content]);

}

Это создаст результат для каждого поля в потоке. Мол, если бы у моего потока было 2 поля:

results таблица:

id | field_id | content 
1  | 1        | Lorem ipsum
2  | 2        | Another ipsum

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

Поскольку содержимое каждого загруженного документа уникально , как сохранить результат для поля и для конкретного документа .

Например, если в моем потоке еще 2 поля, но я загружаю 2 документа:

results таблица:

id | field_id | document_id | content 
1  | 1        | 1           | Lorem ipsum
2  | 2        | 1           | Another ipsum
3  | 1        | 2           | Another unique content
4  | 2        | 2           | Yet another unique content

1 Ответ

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

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

Результат

public function fields()
{
  return $this->hasMany(Field::class);
}

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

Документ

public function results()
{
  return $this->hasMany(Result::class);
}

Поле


public function stream()
{
  return $this->belongsTo(Stream::class);
}

public function result()
{
  return $this->hasOne(Result::class);
}

А потом:

$document = Document::find(1);
$result = new Result();

foreach($stream->fields as $field)
{
    $content = myParseFunction($document->content);

    $result->save(['field_id' => $field->id, 'document_id'=>$document->id, 'content' => $content]);

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