2017-08-29 66 views
0

這是我的博文模型。類型鑄造laravel json響應關係渴望加載

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'的輸出是一個數組。但是我需要在laravel josn響應中接收'commentsCount''likesCount'的數字,以及作爲輸出的'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語句類的頂部:

use Illuminate\Database\Eloquent\Relations\Relation; 

您模型可以再看看這樣的:

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'); 
    } 
} 

,且查詢看起來是這樣的:

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

希望這有助於!

0

您可以使用Laravel蒙上: 您可以添加每個模型內部下面蒙上值,每例如:

protected $casts = [ 
    'isLiked' => 'boolean', 
];