Laravel雄辩,如果“匿名”字段为1,则将“用户名”更改为匿名

时间:2018-09-30 20:57:32

标签: php mysql laravel eloquent

我有一个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(postsanonym = 0,users。{{1} },'Anonym''作为username的用户名,其中(1)中的usersusers

2 个答案:

答案 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的MutatorsAttribute Casting可能会更容易,而不是使查询变得混乱:

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

public function getAuthorAttribute()
{
    return $this->anonym ? 'Anonym' : $this->user->username;
}

首先,它将anonym转换为布尔值,因此您不必担心它是整数还是字符串。

当您echo $post->author时,Eloquent将在后台静默调用getAuthorAttribute()。由于author实际上不是作为属性存在的,因此您几乎可以将其命名。