Объединение данных из разных таблиц в одну коллекцию - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть таблица базы данных под названием «регистрация», которая отображает пользователей на роль, которую они играют в данном проекте.Например, пользователь может быть руководителем проекта в проекте А, а также обычным работником проекта в проекте В или супервизором в проекте С. Поэтому таблица «регистрации» имеет два внешних ключа, один из которых соединяет его с таблицей «пользователи» идругой к таблице "проектов".Я создал представление, в котором я хочу перечислить все проекты, связанные с конкретным пользователем.Тем не менее, я застреваю в работе с коллекциями, массивами и объектами Laravel, так как не могу понять, как предоставить представлению нужную коллекцию, чтобы он мог просто циклически отображать все проекты, которые есть у текущего пользователя.часть.При использовании приведенного ниже кода я передаю только последний проект представлению (т. Е. Последний проект, прошедший цикл foreach).Однако, как уже упоминалось, я требую, чтобы все его проекты были перечислены.

Я попытался создать массив для $ проектов в цикле foreach контроллера, но это, по сути, оборачивает коллекцию в еще одну оболочку массива.При добавлении -> toArray () это приводит к простому массиву, но я не могу получить доступ к атрибутам в представлении, так как это не объект.Может быть, кто-то может указать мне в правильном направлении.

Вот модели:

registration.php

<?php

namespace konsens24;

use Illuminate\Database\Eloquent\Model;

class Registration extends Model
{
    ...

    public function user()
    {
      return $this->belongsTo(User::class);
    }

    public function project()
    {
      return $this->belongsTo(Project::class);
    }

}

user.php

<?php

namespace konsens24;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;


class User extends Authenticatable
{
    ...

    public function projects()
    {
      return $this->hasMany(Project::class, 'owner_id');
    }

    ...

    public function registrations()
    {
      return $this->hasMany(Registration::class, 'user_id');
    }
}

project.php

<?php

namespace konsens24;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
    ...

    public function owner()
    {
      return $this->belongsTo(User::class);
    }

    public function registrations()
    {
      return $this->hasMany(Registration::class, 'project_id');
    }

    ...
}

ProjectsController.php

<?php

namespace konsens24\Http\Controllers;

use Illuminate\Http\Request;

use konsens24\Project;
use konsens24\Mail\ProjectCreated;
use konsens24\User;
use konsens24\Registration;
use Illuminate\Support\Facades\DB;

class ProjectsController extends Controller
{

    public function __construct()
    {
      $this->middleware('auth');

    }

    public function index()
    {

        $registrations = auth()->user()->registrations;

        foreach ($registrations as $registration) {
          $project_id = $registration->project_id;
          $projects = Project::where('id', $project_id)->get();
            foreach ($projects as $project){
              echo $project->id;    // just for testing purposes, it displays the correct info here
              echo $project->title; // just for testing purposes, it displays the correct info here
         }
        }

        return view('projects.index', compact('registrations', 'projects'));

    }

    ...

}

index.blade.php

@extends('layouts.app')

@section('content')

    <h1 class="title">Cases</h1>
    <ul>
        @foreach ($projects as $project)
          <li>
            <a href="/projects/{{ $project->id }}">
              {{ $project->title }}
            </a>
          </li>
        @endforeach
    </ul>

@endsection

1 Ответ

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

Вы определяете $projects внутри цикла, поэтому после цикла его значение будет последним из них.

Также, согласно вашей Registration модели, она принадлежит только одному Project, но код контроллера ведет себя иначе.

Итак, вы можете исправить это так:

// 1. Fill in the loop
$registrations = auth()->user()->registrations;
$projects = [];

foreach ($registrations as $registration) {
  $projects[] = $registration->project;
  // do something else with registration
}

// 2. Just pick projects from registrations
$user = auth()->user()->load('registrations.project');
$registrations = $user->registrations;
$projects = $registrations->pluck('project');    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...