2017-10-19 17 views
0

コレクションアイテムをループして、コレクションアイテムのユーザーのモデルの属性にアクセスしています。Laravel - コレクション内の最新のモデル属性を取得する

$advancedBookingsQuery = Booking::query(); 
$advancedBookingsQuery = $advancedBookingsQuery->where('type', 2) 
    ->with('staffMember.user'); 
$advancedBookings = $advancedBookingsQuery->get(['id', 'requested_booking_time', 'estimated_booking_time']); 

foreach ($advancedBookings as $booking) { 
    $barberQueueLength = $booking->staffMember->user->currentQueueLength; 
    $booking->update(['estimated_booking_time' => Carbon::now()->addMinutes($barberQueueLength)]); 
} 

currentQueueLengthメソッドは、いくつかのクエリを実行して、要件を満たす合計予約の長さを取得します。

public function getCurrentQueueLengthAttribute() 
{ 
    // Calc length of all bookings with an estimated booking time value 
} 

問題は、currentQueueLength属性が、コレクション内の各アイテムに対して常に同じ値を返すことです。

コレクションの各反復で属性を新しく呼び出す方法はありますか?>各メソッド? $ advancedBookingsコレクションが収集されたときの値を使用しているようです。

私はまたリフ​​レッシュ方法を検討してみてください、ちょうど昨日、同様の問題に遭遇した代わりに

$booking->staffMember->user->currentQueueLength; 

を使用しての

$booking->staffMember()->first()->user()->first()->currentQueueLength; 

を使用してみてください

+0

当たり[Laravelアクセッサとミューテータ(https://laravel.com/docs/5.5/eloquent-mutators#accessors - と - mutators)、 'currentQueueLength'は' current_queue_length'であってはなりませんか? – ljubadr

答えて

0

https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Model.html#method_refresh 私は個人的にそれをするので試していません最初の解決策は私の問題を解決しました

+1

' - > get()'は 'Collection'を返すので、' - > get() - > user() 'は存在しない' Collection'の 'User'関数にアクセスしようとして失敗します。 –

+0

私の悪い、最初に使用していたはずですが、修正を使って回答を編集する –

+1

これは問題ありませんが、 ' - > staffMember'(括弧なし)は' - > first() 'または' - > get()関係が ' - > with()'句として含まれているかどうかによって異なり、 'hasOne'、' belongsTo'などに基づいています。まだ必要以上のステップを追加しています。上位の構文は正しいです(関係が正しく定義されていると仮定して)。余分なクエリが実行されないため、メモリが少なくなります。 –

関連する問題