查询生成器获取结果数组而不是 Laravel 中的对象

Posted

技术标签:

【中文标题】查询生成器获取结果数组而不是 Laravel 中的对象【英文标题】:Query builder get array of results instead of objects in Laravel 【发布时间】:2020-09-08 16:22:49 【问题描述】:

这是我的查询

DB::table('genres')
        ->join('albumGenres', 'genres.id', '=', 'albumGenres.genre_id')
        ->join('albums', 'albumGenres.album_id', '=', 'albums.id' )
        ->select('genres.id')
        ->where('albumGenres.album_id','=',$this->id)->get();

但我得到了这样的东西

"genre_id": [
        
            "id": "4"
        ,
        
            "id": "8"
        
    ]

我应该怎么做才能得到一个数组的结果

"genre_id" : [4,8]

【问题讨论】:

$result = array_column($result->toArray(), 'id'); 也许? json_decode($result,TRUE); 【参考方案1】:

只需使用->lists('id') 而不是->get()

DB::table('genres')
    ->join('albumGenres', 'genres.id', '=', 'albumGenres.genre_id')
    ->join('albums', 'albumGenres.album_id', '=', 'albums.id' )
    ->where('albumGenres.album_id', '=', $this->id)
    ->lists('genres.id');

阅读更多:http://laravel.com/docs/5.0/queries#selects(检索列值列表部分)

【讨论】:

这将返回 null。但是,使用它来查询其他字段可以按预期工作。什么? return DB::table('genres') ->join('albumGenres', 'genres.id', '=', 'albumGenres.genre_id') ->join('albums', 'albumGenres.album_id', '=', 'albums.id' ) ->select('genres.name') ->where('albumGenres.album_id','=',$this->id)->lists('name'); @Vector 我刚刚编辑了我的答案,用更新的代码再试一次。 @Vector 将 ->lists('genres.id'); 替换为 ->toSql(); 并将结果粘贴到此处。 select 'genres'.'id' from 'genres' 内部连接 ​​'albumGenres' on 'genres'.'id' = 'albumGenres'.'genre_id' 内部连接 ​​'albums' on 'albumGenres' .'album_id' = '专辑'.'id' 其中'albumGenres'.'album_id' = ? (用引号替换反引号) @Vector 请在 mysql/pgsql 控制台中运行此查询(不要忘记将 ? 替换为您想要的 id)并将结果粘贴到此处。【参考方案2】:

对于新版本的 Laravel,你应该使用 pluck() 而不是 lists()。

DB::table('genres')
->join('albumGenres', 'genres.id', '=', 'albumGenres.genre_id')
->join('albums', 'albumGenres.album_id', '=', 'albums.id' )
->where('albumGenres.album_id', '=', $this->id)
->pluck('genres.id');

这是文档中的参考:https://laravel.com/docs/5.4/queries#retrieving-results(请参阅“检索列值列表”)

【讨论】:

在处理批量数据时使用 pluck 并不好。速度很慢。

以上是关于查询生成器获取结果数组而不是 Laravel 中的对象的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 获取一个查询以检查 QueryBuilder 是不是存在两个关系中的至少一个而不忽略其他过滤器

Laravel 5.2 查询生成器作为单个数组(不是 2D 或 3D)

选择数组中的值,分离并查询数据库 laravel

laravel 查询生成器总是返回?而不是变量的值

Laravel 查询生成器。返回嵌套结构化数据

Laravel DB 选择语句。查询返回列名作为结果而不是值