laravel-elokent如果“匿名”字段为1,则将“用户名”更改为匿名

y3bcpkx1  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(324)

我有一个 Posts 包含列的表 anonym 可以是1或0。我使用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,
    },

现在,当 anonym 在posts表中是 1 ,我希望用户名不是例如“max”,而是“anonyman”。我尝试了一个原始的查询,但我无法让它工作。
用雄辩的语言能做到这一点吗?
编辑:
我尝试了以下建议:

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 . username ,'anonyman')作为用户名 users 哪里 users . id 在(1)中)

a9wyjsp7

a9wyjsp71#

你可以这样做:

$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);
zkure5ic

zkure5ic2#

与其把查询弄得乱七八糟,不如更容易利用elokent的变种和属性转换 Post 型号:

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

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

首先,它投射 anonym 所以你不必担心它到底是整数还是字符串。
当你 echo $post->author ,雄辩的会默默呼唤 getAuthorAttribute() 在后台。自 author 不是作为属性存在的,你可以随便命名。

相关问题