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:
多数の関係をモーフィングするために同じロジックを使用できます。