Nano Hash - криптовалюты, майнинг, программирование

laravel красноречиво получить все данные об отношениях

У меня есть следующая настройка в Laravel - клиент, который может иметь много отчетов, содержащих много строк данных.

Клиентский объект (может иметь много отчетов)

class Client extends Model
{
    public function reports()
    {
      return $this
        ->belongsToMany('App\Report')
        ->withTimestamps();
    }
}

Объект отчета (может иметь много строк данных)

class Report extends Model
{
    public function data()
    {
      return $this
        ->belongsToMany('App\Data', 'report_data')
        ->withTimestamps();
    }
}

Объект данных (принадлежит отчету)

class Data extends Model
{

    public function report()
    {
      return $this
        ->belongsTo('App\Report')
        ->withTimestamps();
    }

}

Если я хочу получить отчет для клиента, я могу сделать это (если я хочу получить первый):

$report = $client -> reports -> first();
var_dump($report -> data); die;

Это дало бы мне все данные для первого отчета.

Or:

foreach($client -> reports as $report){
     var_dump($report -> data);
}

Теперь вопрос: если у клиента было 3 отчета, как я могу объединить все данные для этих 3 отчетов?

Так, например, если у клиента было 3 отчета, например:

Report 1
Name: test
View: 100
Revenue: 10

Report 2
Name: foo
Views: 50
Revenue: 30

Report 3
Name: bah
Views: 40
Revenue: 20

Мы могли бы получить:

Name: Total
Views: 190
Revenue: 60

Я пробовал перебирать отчеты и объединять их в одну коллекцию, но это не работает.

  $reports = $client -> reports -> all();

  $collection = new \Illuminate\Database\Eloquent\Collection;

  foreach($reports as $report){

      $collection = $collection -> merge($report -> data);
  }

  var_dump($collection);
  die;

Отношения поставили меня немного в тупик

23.10.2017

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

Ответы:


1

В Laravel вы можете использовать Eager Loading, чтобы получить модель со связанным данные. Если у вас уже есть модель и вам нужны связанные с ней данные, вы можете использовать отложенную загрузку.

$client->load('reports.data');

После этого вы можете проверить содержимое с помощью

dd($client);

Чтобы получить общее количество просмотров, вы можете сделать

$totalViews = $client->reports->sum('views');

Поскольку вы будете работать с коллекциями

И вы увидите поле relations, заполненное всеми отчетами, а внутри них всеми результатами данных для каждого из них.

РЕДАКТИРОВАТЬ

Если вы хотите, чтобы все данные были в одном месте, вы можете использовать

$allData = $client->reports->pluck('data');

Кроме того, имейте в виду, что, возможно, Laravel имеет атрибут data, зарезервированный в моделях, поэтому, если у вас по-прежнему возникают проблемы, попробуйте изменить имя этого отношения на что-то вроде reportData и модель ReportData.

23.10.2017
  • Я могу получить все отчеты с соответствующими результатами данных, но мне нужно объединить их в один отчет и суммировать все значения данных. 23.10.2017
  • Вы не должны этого делать, потому что модель представляет собой запись базы данных. Я отредактирую свой ответ, чтобы добавить решение для этого. 23.10.2017

  • 2

    попробуй это

    $reports = [];
    foreach($client -> reports as $report){
         $reports [] = $report->data;
    }
    var_dump($reports);
    
    23.10.2017
  • Мне нужно, чтобы результат был красноречивой моделью отчета - с данными, представляющими собой объединенные данные 3 отчетов. 23.10.2017
  • в каждом отчете много данных ryt ?? поэтому вам нужны все данные отчета в виде одного массива ?? 23.10.2017
  • Мне нужно, чтобы все данные отчетов были суммированы в один 23.10.2017
  • Name: test это название отчета? Views: 40 это сумма всех данных для одного отчета ?? 23.10.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..