2017-02-23 11 views
1

私はLaravelの関係を熱心に、または怠惰に読み込むことができます。私はまた、関係オブジェクトは基本的に偽装されたクエリオブジェクトであり、$user->load('teams')という呼び出しはそのクエリを実行し、それが$ userオブジェクトに追加されることを知っています。誰がコメントから得点を得ているか。Laravelで属性をeager/lazyに読み込むことはできますか?

SELECT `user_id`, sum(`points`) AS `total_points` FROM `user_comments` where `id` = ? 

私は一度にすべてをロードしたい場合は、私はこのクエリを実行します:データベース呼び出しでユーザーのポイントを得るために、私はこのような何かを実行でしょう

SELECT `users`.*, sum(`user_comments`.`points`) AS `total_points` 
FROM `users` LEFT JOIN `user_points` ON `users`.`id` = `user_comments`.`user_id` 
GROUP BY `users`.`id` 

を私がしたいですこれらのタスクを達成するためにLaravelを使用してください。私はよう

User::where('age', '>', 40)->with('total_points')->get(); 

このような何かを書くと同時に、ユーザーとその合計スコアをロードするために、この

$user->total_points 

のような値にアクセスするためのだろう。多くのレコードがあり、ユーザーがいるたびにDB結合クエリを常に呼びたくないと思います。私はまた、私は彼らの合計ポイント値が必要な場合は、各ユーザーのためにすべてのコメント自体を読み込まないことを好むだろう。

Laravelでこれを達成するためにリレーションシップビルダを使用する方法はありますか?

答えて

4

public function total_points() { 
     return $this->hasOne('user_comments') 
      ->selectRaw('sum(points) as points, user_id') 
      ->groupBy('user_id'); 
    } 

以下のようなあなたのユーザーモデルで一対一の関係を作る次に、コントローラ

この作品
$user = User::where('age', '>', 40)->with('total_points')->get(); 
+0

でこれを行います!私はそれを働かせたら、$ appends属性を追加して関係がロードされていることを確認し、値を取得します。 – whiterook6

+0

しかし、属性であれば不可能です!私はこれに対して何をしなければならないのですか? – shmoolki

関連する問題