我有一个Posts
表,其中包含可以为1或0的列anonym
。我使用Eloquent选择帖子,并像这样加入用户:
$posts = Post::with(
array('user'=>function($query){
$query->select('id','username');
}))
->with('category')
->withCount('likes')
->orderBy('id', 'DESC')
->paginate(25);
返回看起来像这样:
"data": [
{
"id": 116,
"user_id": 3,
...
"anonym": 1,
"likes_count": 0,
"user": {
"id": 3,
"username": "Max"
},
"category": null,
},
现在,当posts表中的anonym
的值为1
时,我希望用户名不要是“最大”但“匿名”。我用原始查询尝试过,但是无法正常工作。
雄辩有可能吗?
编辑:
我尝试了以下建议:
array('user'=>function($query){
$query->select(DB::raw("IF(`posts`.`anonym` = 0, `users`.`username`, 'Anonym') as username"));
}))
但我收到错误消息,找不到posts.anonym:
未找到列:1054“字段列表”中的未知列“ posts.anonym”(SQL:选择IF(posts
。anonym
= 0,users
。{{1} },'Anonym''作为username
的用户名,其中(1)中的users
。users
答案 0 :(得分:1)
您可以尝试这样的事情:
$posts = Post::join('users', 'users.id', '=', 'posts.user_id')
->select(
'posts.*',
DB::raw('IF(`posts`.`anonym`, `users`.`username`, "Anonym") as username')
)
->with('category')
->withCount('likes')
->orderBy('id', 'DESC')
->paginate(25);
答案 1 :(得分:0)
在您的Post
模型中利用Eloquent的Mutators和Attribute Casting可能会更容易,而不是使查询变得混乱:
protected $casts = [
'anonym' => 'boolean',
];
public function getAuthorAttribute()
{
return $this->anonym ? 'Anonym' : $this->user->username;
}
首先,它将anonym
转换为布尔值,因此您不必担心它是整数还是字符串。
当您echo $post->author
时,Eloquent将在后台静默调用getAuthorAttribute()
。由于author
实际上不是作为属性存在的,因此您几乎可以将其命名。