类型铸造laravel json响应关系渴望加载

问题描述:

这是我的博文模型。类型铸造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

您可能会发现使用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); 

希望这有助于!

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

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