En supposant que vous avez Post->hasMany->Like
relation et vous avez déclaré aime relation comme:
class Post{
public function likes(){
return $this->hasMany('Like');
}
}
créer une nouvelle fonction disent likeCountRelation
que:
public function likeCountRelation()
{
$a = $this->likes();
return $a->selectRaw($a->getForeignKey() . ', count(*) as count')->groupBy($a->getForeignKey());
}
vous pouvez désormais remplacer __get()
fonction:
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);
}
}
ou vous pouvez utiliser la fonction getattribute comme:
public function getLikesCountAttribute(){
return $this->likesCountRelation->first() ? $this->likesCountRelation->first()->count : 0;
}
et simplement accéder likesCount comme $post->likesCount
vous pouvez charger même hâte qu'il aime:
$posts=Post::with('likesCountRelation')->get();
foreach($post as $post){
$post->likesCount;
}
NOTE:
logique même peut être utilisé pour de nombreuses relations morphing.
Le code que vous avez fourni ne fonctionne pas. Le nombre like_count n'est pas défini – edi9999
@ edi9999, il doit être défini par Laravel à la volée puisqu'il a été rempli en tant que colonne. Jetez un oeil à: DB :: raw ("count (*) as like_count") – rioastamal
@ edi9999 J'essaie de faire quelque chose de similaire, mais ça ne fonctionnait pas quand le compte était 0 (depuis 'first() 'renvoie null). Pour faire face à ce cas particulier, j'ai fait ceci: '$ beat-> likes-> first()? $ beat-> aime-> first() -> like_count: 0'. Peut-être que vous avez eu le même problème? –