2

複数のリレーションが定義された複雑なモデルがあります。この例では、Likeモデルを数えて名前付きのプロパティを作成likesし、REST サービスから返されるようにします。

モデル数を動的プロパティに熱心にロードすることは可能ですか?

$beat = Post::with(
         array(
            'user',
            'likes' => function($q){
                $q->count();
            }
        ))
        ->where('id', $id)
        ->first();
4

2 に答える 2

4

Post->hasMany->Likeあなたが関係を持っていて、好きな関係を次のように宣言したと仮定します。

class Post{

  public function likes(){
   return $this->hasMany('Like');
  }
}

次のように新しい関数を作成しますlikeCountRelation

public function likeCountRelation()
{
    $a = $this->likes();

    return $a->selectRaw($a->getForeignKey() . ', count(*) as count')->groupBy($a->getForeignKey());
}

__get()関数を次のようにオーバーライドできるようになりました。

public function __get($attribute)
{

    if (array_key_exists($attribute, $this->attributes)) {
        return $this->attributes[$attribute];
    }

    switch ($attribute) {

        case 'likesCount':
            return $this->attributes[$attribute] = $this->likesCountRelation->first() ? $this->likesCountRelation->first()->count : 0;
            break;

        default:
            return parent::__get($attribute);

    }
}

または getattribute 関数を次のように使用できます。

public function getLikesCountAttribute(){
 return $this->likesCountRelation->first() ? $this->likesCountRelation->first()->count : 0;
}

likesCount にアクセスするだけで、$post->likesCount次のように熱心にロードすることもできます。

$posts=Post::with('likesCountRelation')->get();
 foreach($post as $post){
  $post->likesCount;
 }

NOTE:多数の関係をモーフィングするために同じロジックを使用できます。

于 2014-10-05T20:33:56.417 に答える
1

Group By機能させるには、SQL ステートメントを使用する必要があります。次のようにクエリを書き直すことができます。

$beat = Post::with(
         array(
            'user',
            'likes' => function($q) {
                // The post_id foreign key is needed, 
                // so Eloquent could rearrange the relationship between them
                $q->select( array(DB::raw("count(*) as like_count"), "post_id") )
                  ->groupBy("post_id")
            }
        ))
        ->where('id', $id)
        ->first();

の結果likesは、1 つの要素を持つ Collection オブジェクトです。PostmodelとLikeisの関係を想定していPost hasMany Likeます。したがって、このようにカウントにアクセスできます。

$beat->likes->first()->like_count;

上記のコードはテストしていませんが、動作するはずです。

于 2013-10-05T14:45:11.580 に答える