Return 相关模型是否有值作为新字段

Return if the related model has a value or not as a new field

我有 Post 模特和相关的“赞”项目。我正在尝试 return 判断相关模型是否有针对经过身份验证的用户的行。所以表格看起来像:

Posts
- id
- body
- etc

Likes
- id
- user_id
- likable_type
- likeable_id

现在我是 return Posts eloquent 和 Posts::get(),但是我想 return 每个模型都有一个参数 is_liked 显示经过身份验证的用户是否喜欢 post。

如果我使用 ->with('likes')->where(function($q)) {} 方法,它只会 return 我得到用户喜欢的 Post 但这不是我想要的。

我希望每个 Post 对象都显示经过身份验证的用户是否喜欢它。如:Post { id, body, is_liked }

除了 运行 for 循环之外,还有其他方法可以实现吗?处理这种情况的最佳方法是什么?


更新

class Post extends Model {
       protected $appends = ['is_liked'];

       public function getIsLikedAttribute() {
          return $this->has('likes.user_id', '=', Auth::id())->exists();
       }

      public function likes() {
        return $this->morphOne('App\Like', 'likeable');
      }
}

class Like extends Model {
   protected $fillable = [
      'user_id', 'likeable_id', 'likeable_type'
   ];

   public function likeable() {
      return $this->morphTo();
   }
}

通过这个变体编写是可行的,但是,$this->has('likes.user_id' 部分 returns 错误

Method Illuminate\Database\Query\Builder::user_id does not exist.

您可以使用 am 访问器并将 属性 添加到追加保护变量:

protected $appends = ['is_liked']; 

public function getIsLikedAttribute() { 
   return $this->likes()->where('user_id',  '=',  Auth::id())->exists();
}

现在您还可以检查访问器,例如

$post->is_liked // bool