将来自不同表的数据合并到一个集合中

时间:2019-04-19 11:06:40

标签: laravel laravel-5 eloquent

我有一个名为“ registrations”的数据库表,该表将用户映射到他们在给定项目中扮演的角色。例如,用户可以是Project A中的项目负责人,也可以是Project B中的普通项目工作人员,也可以是Project C中的主管。因此,“ registrations”表具有两个外键,其中一个将其连接到“ users”表,另一个到“项目”表。我已经创建了一个视图,其中我想列出特定用户的所有项目参与。但是,由于无法确定如何为视图提供所需的集合,因此它只能循环显示当前用户所在的所有项目,因此无法使用Laravel集合,数组和对象一部分。 使用以下代码时,我只会将最后一个项目移交给视图(即,通过foreach循环的最后一个项目)。但是,如上所述,我要求列出他的所有项目。

我试图在控制器的foreach循环中为$ projects创建一个数组,但这基本上将集合包装到了另一个数组外壳中。当添加-> 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 :(得分:0)

您要在循环中定义$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');