Laravel 5 - 获取按列分组的查询生成器结果
Laravel 5 - get query builder results grouped by column
比如我有查询:
$posts = DB::table('posts')->select(['id', 'user_id', 'title'])->get();
然后 $posts
数组如下所示:
array(3) {
[0]=>
object(stdClass) (3) {
["id"]=>
int(1)
["user_id"]=>
int(1000)
["title"]=>
string(8) "Post # 1"
}
[1]=>
object(stdClass) (3) {
["id"]=>
int(2)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 2"
}
[2]=>
object(stdClass) (3) {
["id"]=>
int(3)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 3"
}
}
如您所见,id 1000
的用户有 1 个 post,id 2000
的用户有 2 个 post。
我想以 user_id
作为键的关联数组形式获得结果:
array(2) {
[1000]=>
array(1) {
[0]=>
object(stdClass) (3) {
["id"]=>
int(1)
["user_id"]=>
int(1000)
["title"]=>
string(8) "Post # 1"
}
}
[2000]=>
array(2) {
[1]=>
object(stdClass) (3) {
["id"]=>
int(2)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 2"
}
[2]=>
object(stdClass) (3) {
["id"]=>
int(3)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 3"
}
}
}
是否有任何好的 Laravel 解决方案来执行此操作?
Laravel 没有办法做到这一点。但是您可以使用此功能手动执行此操作:
public static function makeAssocArrByField($arr, $field)
{
$assocArr = array();
foreach($arr as $arrObj)
{
if(isset($arrObj[$field]))
$assocArr[$arrObj[$field]] = $arrObj;
}
return $assocArr;
}
调用方法为:
$posts = makeAssocArrByField($posts, 'user_id');
这将 return 按照您要求的格式排列。
您可能想查看 Eloquent Relationships 而不是使用查询生成器。在您的情况下,您有一个 一对多 关系。所以你会有一个看起来像这样的 User
模型:
class User extends Model {
public function posts()
{
// One User can have many Posts
return $this->hasMany('App\Post');
}
}
还有一个Post
模特:
class Post extends Model {
public function user()
{
// A Post belongs to one User
return $this->belongsTo('App\User');
}
}
然后你可以像这样获取用户的帖子:
$users = User::all();
foreach ($users as $user)
{
$posts = $user->posts;
// $posts will now contain a Collection of Post models
}
比如我有查询:
$posts = DB::table('posts')->select(['id', 'user_id', 'title'])->get();
然后 $posts
数组如下所示:
array(3) {
[0]=>
object(stdClass) (3) {
["id"]=>
int(1)
["user_id"]=>
int(1000)
["title"]=>
string(8) "Post # 1"
}
[1]=>
object(stdClass) (3) {
["id"]=>
int(2)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 2"
}
[2]=>
object(stdClass) (3) {
["id"]=>
int(3)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 3"
}
}
如您所见,id 1000
的用户有 1 个 post,id 2000
的用户有 2 个 post。
我想以 user_id
作为键的关联数组形式获得结果:
array(2) {
[1000]=>
array(1) {
[0]=>
object(stdClass) (3) {
["id"]=>
int(1)
["user_id"]=>
int(1000)
["title"]=>
string(8) "Post # 1"
}
}
[2000]=>
array(2) {
[1]=>
object(stdClass) (3) {
["id"]=>
int(2)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 2"
}
[2]=>
object(stdClass) (3) {
["id"]=>
int(3)
["user_id"]=>
int(2000)
["title"]=>
string(8) "Post # 3"
}
}
}
是否有任何好的 Laravel 解决方案来执行此操作?
Laravel 没有办法做到这一点。但是您可以使用此功能手动执行此操作:
public static function makeAssocArrByField($arr, $field)
{
$assocArr = array();
foreach($arr as $arrObj)
{
if(isset($arrObj[$field]))
$assocArr[$arrObj[$field]] = $arrObj;
}
return $assocArr;
}
调用方法为:
$posts = makeAssocArrByField($posts, 'user_id');
这将 return 按照您要求的格式排列。
您可能想查看 Eloquent Relationships 而不是使用查询生成器。在您的情况下,您有一个 一对多 关系。所以你会有一个看起来像这样的 User
模型:
class User extends Model {
public function posts()
{
// One User can have many Posts
return $this->hasMany('App\Post');
}
}
还有一个Post
模特:
class Post extends Model {
public function user()
{
// A Post belongs to one User
return $this->belongsTo('App\User');
}
}
然后你可以像这样获取用户的帖子:
$users = User::all();
foreach ($users as $user)
{
$posts = $user->posts;
// $posts will now contain a Collection of Post models
}