2017-06-28 4 views
2

私は一見愚かでクレイジーな状況です。私は、ユーザーのためのアクティビティログを持って、私のユーザモデルがそれで、この関係を持っていますLaravel dd()以外の何かをしているときに孤独な人間関係はありません

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

かなりまっすぐ進むと私はそれが正常に動作し、すべてのログのための単一のユーザーオブジェクトを確認してください。だから私は1つのページで、私は最後のログを記録したい、私はそれからcreated_atの日付が必要です。ユーザーを読み込むときに実行します

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

これは期待どおりに最後のログを返します。実行したときに日付を取得したいとき

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

期待どおりの日付の文字列が出力されます。しかし、変数に入れたり、エコーしたりするなど、何か他のことをしようとすると、activityLogs() - > first()がオブジェクトではないというエラーが表示されます。 (foreach ($users as $user)ループ内で)私の見解でコードが

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

であり、それは単に非オブジェクトのプロパティを取得しようとする私にエラー

ErrorException(E_ERROR) を与えます(閲覧:のroot_path /resources/views/acp/partials/profiles.blade.php)(閲覧:のroot_path /resources/views/acp/partials/profiles.blade.php)

私はコレクションとhasManyオブジェクトの両方としてactivityLogsにアクセスしようとしました。私もjson_decodeと結果のJSON文字列を変換しようとしましたが、それはまだオブジェクトではないことについて不平を言う。

なぜですか? ddを使用しているときに値を完全にうまく取得できるのはなぜですか。他のものはです。突然JSON文字列ですか?私はこれを検索しようとしましたが、どのような言葉の組み合わせであっても、EloquentオブジェクトをJSONに変換する方法についての質問とガイドがあります。あなたは必ずユーザーにするためにチェックする必要があります

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

または

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

を使用(https://stackoverflow.com/questions/34571957/laravel-hasmany-method-not- '{{$ user-> activityLogs-> first() - > created_at}}' – rbaskam

+0

はい、私もそれを試みました。 – Styphon

+0

すでに 'with'でアクティビティログをロードしているので、すべてを行う必要はありません。 '$ user'のダンプを見て、そこにアクティビティログがあるかどうか調べてみてください。 – aynber

答えて

2

+0

これは、 'dd($ - > activityLogs-> first()) 'を使うと、正しいレコードが表示されます。 – Styphon

+0

これはまさに最初のユーザーですが、ユーザーのコレクションをループしていて、コレクションのユーザーのうちの1人(最初のユーザーではない)にはアクティビティログがありません。 –

+0

もちろん、なぜ前にそのことを考えなかったのですか?ありがとうございました。 – Styphon

0

すでにコレクションにそれをeagerLoadingしているので、あなたは、それについて移動するには、2つの方法があるはずです最後の活動があります。 first()は、ログがない場合はnullを返します。あなたはあなたのループの存在を確認する必要があります。

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

または[Laravel hasManyの]私はここで見てきた答えからブレードの@if/@else

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

私はすでにそれを試みました、私はちょうど '非オブジェクトのプロパティを取得しようとする'を取得します。何らかの理由でLogオブジェクトがJSON文字列に変換されました。 '$ user-> activityLogs [0]'は配列ではなくLaravel Collectionであるため、使用することはできません。 – Styphon

+0

私はそれをローカルで試してみましたが、機能しましたが、古いバージョンのLaravelを使用しています。 *ほら* – aynber

+0

少なくともお試しいただきありがとうございます:) – Styphon

関連する問題