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
我有 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