2017-06-28 23 views
2

Ich habe eine scheinbar dumme und verrückte Situation. Ich habe Aktivitätsprotokolle für die Benutzer, hat meine Benutzermodell diese Beziehung in es:Laravel Eloquente Beziehung kein Objekt, wenn etwas anderes als dd()

public function activityLogs() 
{ 
    return $this->hasMany(Log::class); 
} 

ziemlich geradlinig und wenn ich ein einzelnes Benutzerobjekt für alle Protokolle überprüfen funktioniert es gut. Also auf einer Seite möchte ich nur das letzte Protokoll aufgezeichnet, ich brauche das created_at Datum davon. Beim Laden der Benutzer starte ich

$users = User::with(
    [ 
     'activityLogs' => function ($query) { 
      $query->orderBy('created_at', 'desc') 
        ->limit(1); 
     } 
    ] 
) 

und dies gibt das letzte Protokoll wie erwartet zurück. Als ich das Datum bekommen, wenn ich

dd($users->first()->activityLogs()->first()->created_at->format("d/m/Y")); 

laufen bekomme ich mit dem Datum eine String Ausgabe wie erwartet. Wenn ich jedoch versuche, etwas anderes damit zu tun, wie es in eine Variable einzufügen oder es zu wiederholen, bekomme ich nur einen Fehler, dass activityLogs() -> first() kein Objekt ist. Der Code aus meiner Sicht (innerhalb einer foreach ($users as $user) Schleife) ist

{{ $user->activityLogs()->first()->created_at }} 

und es gibt mir nur den Fehler

Error (E_ERROR) Den Versuch, Eigentum von Nicht-Objekt zu erhalten (Ansicht: root_path /resources/views/acp/partials/profiles.blade.php) (Ansicht: root_path /resources/views/acp/partials/profiles.blade.php)

Ich habe versucht, auf activityLogs als eine Sammlung und hasMany Objekt zuzugreifen. Ich habe auch versucht, die resultierende JSON-Zeichenfolge mit json_decode zurück zu konvertieren, aber es klagt immer noch darüber, kein Objekt zu sein.

Warum? Warum kann ich den Wert vollkommen in Ordnung bekommen, wenn ich dd benutze, aber wenn ich versuche irgendetwas anderes es ist plötzlich eine JSON-Zeichenfolge? Ich habe versucht, dies zu googeln, aber egal, welche Kombination von Wörtern ich versuche, es kommt nur mit Fragen und Anleitungen, wie man ein Eloquent-Objekt in JSON, das Gegenteil von dem, was ich will, konvertieren.

+0

Aus einer Antwort, die ich hier gesehen habe [Laravel HasMany] (https://stackoverflow.com/questions/34571957/laravel-hasmany-method-not- funktionierend) hast du versucht '' {{$ user-> activityLogs-> first() -> created_at}} ' – rbaskam

+0

Ja, das habe ich auch ausprobiert. – Styphon

+0

Sie laden bereits die Aktivitätsprotokolle mit 'with', Sie müssen also nicht alles tun. Versuchen Sie, den Dump für Ihren '$ user' zu betrachten, um zu sehen, ob sich das Aktivitätsprotokoll dort befindet. – aynber

Antwort

2

Sie müssen sicher den Benutzer machen überprüfen hat eine letzte Aktivität. first() gibt null zurück, wenn keine Protokolle vorhanden sind. Sie sollten in Ihrer Schleife auf Existenz prüfen.

@foreach($user as $user) 
    {{$user->activityLogs->count() > 0 ? $user->activityLogs->first()->created_at : 'User Has No Activity!'}} 
@endforeach 

oder benutzen Klinge @if/@else

@foreach($user as $user) 
    @if($user->activityLogs->count() > 0) 
     {{$user->activityLogs->first()->created_at}} 
    @else 
     'User Has No Activity!' 
    @endif 
@endforeach 
+0

Es tut, was ich sehe, wenn ich 'dd ($ -> activityLogs-> first())' es zeigt mir die richtige Aufzeichnung. – Styphon

+0

Das ist nur der erste Benutzer, aber Sie durchlaufen eine Sammlung von Benutzern, und einer der Benutzer in der Sammlung (nicht der erste Benutzer) hat keine Aktivitätsprotokolle. –

+0

Natürlich, warum habe ich nicht vorher daran gedacht. Vielen Dank. – Styphon

0

sollte es zwei Möglichkeiten geben Sie es gehen kann, sind da Sie es bereits in einer Sammlung eagerLoading:

$user->activityLogs->first()->created_at 

oder

$user->activityLogs[0]->created_at 
+0

Ich habe das schon probiert, ich bekomme nur 'Versuch, die Eigenschaft eines Nicht-Objekts zu bekommen'. Aus irgendeinem Grund wurde das Log-Objekt in eine JSON-Zeichenfolge konvertiert. Außerdem können Sie '$ user-> activityLogs [0]' nicht verwenden, da es sich um eine Laravel-Sammlung und nicht um ein Array handelt. – Styphon

+0

Ich habe es lokal versucht und es hat funktioniert, aber ich benutze eine ältere Version von Laravel, und das kann einen Unterschied machen. * Achselzucken * – aynber

+0

Danke für den Versuch mindestens :). – Styphon

Verwandte Themen