我有一个名为“ 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
答案 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');