2017-06-01 7 views
0

Ich baue eine Suchfunktion, aber ich habe Probleme mit einer scheinbar einfachen, aber eindeutig schwierigen Funktion.Laravel 5.4 Suchbeziehung mit Pivot in Blade

In den Suchergebnissen habe ich erfolgreich alle Benutzer angezeigt, die eine bestimmte Fähigkeit haben. (In diesem Fall ist es eine belongsToMany() Beziehung), sowie ihre first_name, last_name und email. Ich möchte, dass der letzte Teil des Eintrags die Kompetenz des Benutzers (im Code als skill_level bezeichnet) in der fraglichen Fähigkeit anzeigt. Im Moment ist skill_level ein Drehpunkt in der Fähigkeit/Benutzer-Beziehung; Sie werden mit einem von vier Strings bezeichnet: "Wills Learn", "Novice", "Intermediate", "Expert", und jeder hat einen id von 1-4 (inklusive).

Hier ist der entsprechende Code:

Controller (teilweise)

public function results(Request $request){ 

    $theskillName = $request->input('theskillName'); 
    $users = User::whereHas('skills', function ($q) use($theskillName) { 
     $q->where('name', '=', $theskillName); 
    })->get(); 
    $skills = Skill::orderBy('name', 'ASC')->get(); 
    if(count($users) > 0){ 
     return view('search.search', compact('users', 'skills', 'theskillName')); 
    } 
    else { 
     return view ('search.search', compact('skills')); 
    } 
    } 

search.blade.php (teilweise)

@if(isset($users)) 
<p>The following people have {{ $theskillName }} as one of their skills:</p> 
<h2>People</h2> 
<table class="table table-striped"> 
    <thead> 
     <tr> 
      <th>First Name</th> 
      <th>Last Name</th> 
      <th>Email</th> 
      <th>Skill Level</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach($users as $user) 
     <tr> 
      <td>{{$user->first_name}}</td> 
      <td>{{$user->last_name}}</td> 
      <td>{{$user->email}}</td> 
      <td>{{$user->???->skill_level }}</td> /* <- What replaces ??? here? */ 
     </tr> 
     @endforeach 
    </tbody> 
</table> 
@endif 

User.php (teilweise)

namespace App; 

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

class User extends Authenticatable 
{ 
    use Notifiable; 

/** 
* The attributes that are mass assignable. 
* 
* @var array 
*/ 
protected $fillable = [ 
    'id', 'first_name', 'last_name', 'middle', 'email', 'status', 'role', 'password' 
]; 

/** 
* The attributes that should be hidden for arrays. 
* 
* @var array 
*/ 
protected $hidden = [ 
    'remember_token' 
]; 

// Gets all of the skills the user knows 
public function skills() 
{ 
    return $this->belongsToMany('App\Skill')->withPivot('skill_level'); 
} 

Alles, was ich so versucht habe weit gibt entweder null für diesen letzten Teil des Eintrags zurück oder spuckt den Fehler Trying to get property of non-object aus. Kann mir jemand einen Einblick geben, was hier zu tun ist?

Update: habe ich versucht, die offensichtliche Antwort $user->pivot->skill_level, die mir gegeben haben Trying to get property of non-object.

+0

Wenn Sie suchen, fügen Sie pivot_column_name – Vilius

+0

so ich denke, in Ihrem Fall wäre es pivot_skill_level – Vilius

Antwort

-1

Ein Kollege gab dies als Antwort:

<td>{{ $user->skills->first(function($skill) use($theskillName) { return $skill->name === $theskillName;})->pivot->skill_level}}</td>

Nicht sicher, wie sicher das ist, wenn.

1

Ein Benutzer viele Fähigkeiten hat. Du hast also viele Fähigkeiten. Sie können so darauf zugreifen.

@foreach($user->skills as $skill) 
    {{ $skill->pivot->skill_level }} 
@endforeach 

oder

{{ $user->skills()->first()->pivot->skill_level }} 

bearbeiten: Basierend auf den Kommentaren, dies zu tun, die abgefragt Ebene der abgefragten Fähigkeit zu holen.

{{ $user->skills()->where('skills.name', $theskillName)->first()->pivot->skill_level }} 
+0

Erste Antwort funktioniert nicht, weil ich nach dem USER mit der abgefragten Fähigkeit suchen. Ich brauche '@foreach ($ users as user)' oder sonst wird es nicht richtig funktionieren. Mein Kollege (der mir die Antwort gegeben hat, die ich gepostet habe) sagte, dass deine zweite Antwort nicht funktioniert, weil sie nur die erste Fähigkeit des Benutzers erfasst, nicht die, die abgefragt wird. –

+0

Beide Antworten werden funktionieren. Der Erste wird alle eingestellten Fähigkeitsstufen abrufen. Das $ user-Modell befindet sich innerhalb der Schleife von $ users, also gibt es kein Problem. Der zweite war ein Beispiel dafür, wie man direkt abholen konnte. Sie haben in Ihrer Frage nie erwähnt, dass Sie nur das abgefragte Skill-Level anzeigen möchten. – Sandeesh