2017-08-29 20 views
0

これは私のポストモデルです。laravel jsonのレスポンスでのタイプキャスト関係eager loading

class Post extends Model 
{ 
    use SoftDeletes; 
    protected $table = 'posts'; 
    protected $fillable = ['title','featuring_image', 'brief', 'body', 'seen_count']; 


    public function user(){ 
     return $this->belongsTo(User::class); 
    } 



    public function comments() 
    { 
     return $this->hasMany(Comment::class); 
    } 

    public function someComments() 
    { 
     return $this->comments()->limit(Constants::COMMENTS_COUNT_LIMIT); 
    } 

    public function commentsCount() 
    { 
     return $this->comments() 
      ->selectRaw('post_id, count(*) as count') 
      ->groupBy('post_id'); 
    } 

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

    public function isLiked() 
    { 
     return $this->likes()->where('user_id', auth()->check() ? auth()->user()->id : 0); 
    } 

    public function likesCount() 
    { 
     return $this->likes() 
      ->selectRaw('post_id, count(*) as count') 
      ->groupBy('post_id'); 
    } 


} 

このモデルでこのクエリを実行しました。このため、テーブルなど、コメントテーブルの間の関係の

$post = Post::with(['categories', 'user', 'commentsCount', 'likesCount', 'isLiked'])->find($post->id); 

'commentsCount', 'likesCount', 'isLiked'用このクエリの出力はアレイです。しかし、'commentsCount''likesCount'の数値を受け取る必要があり、laravel josnレスポンスで'isliked'のブール値を出力する必要があります。

+0

あなたはLaravelのどのバージョンを使用していますか? –

+0

@RossWilson \t laravel v5.4.35 – AHS441

答えて

2

withCount()の代わりにEloquentを使用する方が簡単かもしれません。

その後is_likedのためにあなたがブール値にしてcastそれを得るためにスコープを使用することができます。

public function scopeIsLiked($query) 
{ 
    if (is_null($query->getQuery()->columns)) { 
     $query->select([$query->getQuery()->from . '.*']); 
    } 

    $relation = Relation::noConstraints(function() { 
     return $this->likes(); 
    }); 

    $q = $this->likes()->getRelationExistenceCountQuery(
     $relation->getRelated()->where('user_id', auth()->check() ? auth()->user()->id : 0)->newQuery(), $query 
    ); 

    $query->selectSub($q->toBase(), 'is_liked'); 
} 

あなたはクラスのトップにRelationためuseステートメントを追加する必要がありますのでご注意ください。

class Post extends Model 
{ 
    use SoftDeletes; 

    protected $table = 'posts'; 

    protected $fillable = ['title', 'featuring_image', 'brief', 'body', 'seen_count']; 

    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function comments() 
    { 
     return $this->hasMany(Comment::class); 
    } 

    public function someComments() 
    { 
     return $this->comments()->limit(Constants::COMMENTS_COUNT_LIMIT); 
    } 

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

    /** 
    * Scope to add the "is_liked" flag. 
    * 
    * @param $query 
    */ 
    public function scopeIsLiked($query) 
    { 
     if (is_null($query->getQuery()->columns)) { 
      $query->select([$query->getQuery()->from . '.*']); 
     } 

     $relation = Relation::noConstraints(function() { 
      return $this->likes(); 
     }); 

     $q = $this->likes()->getRelationExistenceCountQuery(
      $relation->getRelated()->where('user_id', auth()->check() ? auth()->user()->id : 0)->newQuery(), $query 
     ); 

     $query->selectSub($q->toBase(), 'is_liked'); 
    } 
} 

use Illuminate\Database\Eloquent\Relations\Relation; 

あなたのモデルは、その後のようになります。

そして、あなたのクエリは次のようになります。

$post = Post::with('categories', 'user') 
    ->withCount('likes', 'comments') 
    ->isLiked() 
    ->find($post->id); 

・ホープこのことができます!

0

あなたはLaravelを使用することができますがキャスト:あなたが例ごとに、値をキャストするために以下を追加することができ、各モデル内 を:

protected $casts = [ 
    'isLiked' => 'boolean', 
]; 
関連する問題