【问题标题】:Laravel pluck method doesn't format object correctlyLaravel pluck 方法无法正确格式化对象
【发布时间】:2019-04-06 19:23:38
【问题描述】:

我必须在 OneToMany relashionship 中建模,并且我已经完成了 ORM 查询以得到嵌套结构中的结果,如下所示:$u->userGroups()->with('space')->get(),我得到了以下结果:

Illuminate\Database\Eloquent\Collection {#3158                            
  all: [                                                                  
    App\UserGroup {#3142                                                  
      role: "CONTRIBUTORS",                                               
      updated_at: "2019-04-06 16:38:43",                                  
      name: "Contributeurs",                                              
      created_at: "2019-04-06 16:38:43",                                  
      slug: "contributeurs",                                              
      id: 789,                                                            
      space: App\Space {#3180                                             
        country: "Congo-Kinshasa",                                        
        address: "40 rue Zozo",                  
        visibility: "public",                                             
        town: "Kinshasa",                                                 
        updated_at: "2019-04-06 16:38:42",                                
        name: "Christian Lisangola",                                      
        logo: "spaces/48fcacca888f0b35235b9edda371554dcfc2afc0.png",      
        created_at: "2019-04-06 16:38:42",                                
        zip_code: "5767",                                                 
        slug: "christian-lisangola",                                      
        id: 850,                                                          
      },                                                                  
    },                                                                    
    App\UserGroup {#3145                                                  
      role: "AUTHORS",                                                    
      updated_at: "2019-04-06 16:38:43",                                  
      name: "Auteurs",                                                    
      created_at: "2019-04-06 16:38:43",                                  
      slug: "auteurs",                                                    
      id: 788,                                                            
      space: App\Space {#3185                                             
        country: "Congo-Kinshasa",                                        
        address: "40 rue Luiss",                  
        visibility: "public",                                             
        town: "Kinshasa",                                                 
        updated_at: "2019-04-06 16:38:42",                                
        name: "Christian Lisangola",                                      
        logo: "spaces/48fcacca888f0b35235b9edda371554dcfc2afc0.png",      
        created_at: "2019-04-06 16:38:42",                                
        zip_code: "5767",                                                 
        slug: "christian-lisangola",                                      
        id: 850,                                                          
      },                                                                  
    },                                                                    
    App\UserGroup {#3148                                                  
      role: "ADMINISTRATORS",                                             
      updated_at: "2019-04-06 16:37:37",                                  
      name: "Administrateurs",                                            
      created_at: "2019-04-06 16:37:37",                                  
      slug: "administrateurs",                                            
      id: 848,                                                            
      space: App\Space {#3170                                             
        country: "États-Unis",                                            
        address: "100 avenue  zazi",                                   
        town: "Houston",                                                  
        visibility: "on_demand",                                          
        updated_at: "2019-04-06 16:37:37",                                
        name: "US",                                                       
        logo: "spaces/8490c3a93d32951d3d8d0ade7c459c70b202c342.png",      
        created_at: "2019-04-06 16:37:37",                                
        zip_code: "33234",                                                
        slug: "us",                                                       
        id: 766,                                                          
      },                                                                  
    },                                                                    
    App\UserGroup {#3151                                                  
      role: "ADMINISTRATORS",                                             
      updated_at: "2019-04-06 16:37:11",                                  
      name: "Administrateurs",                                            
      created_at: "2019-04-06 16:37:11",                                  
      slug: "administrateurs",                                            
      id: 765,                                                            
      space: App\Space {#3175                                             
        country: "États-Unis",                                            
        address: "100 avenue zozo",                                   
        town: "Houston",                                                  
        visibility: "private",                                            
        updated_at: "2019-04-06 16:37:11",                                
        name: "Lims INC",                                                
        logo: "spaces/4f1c5ac285bbc38919133b83de58ac1f7802fea4.png",      
        created_at: "2019-04-06 16:37:11",                                
        type: "private",                                                  
        zip_code: "343",                                                  
        slug: "lims-inc",                                                
        id: 844,                                                          
      },                                                                  
    },                                                                    
    App\UserGroup {#3154                                                  
      role: "ADMINISTRATORS",                                             
      updated_at: "2019-04-06 16:36:33",                                  
      name: "Administrateurs",                                            
      created_at: "2019-04-06 16:36:33",                                  
      slug: "administrateurs",                                            
      id: 1,                                                              
      space: App\Space {#3165                                             
        country: "États-Unis",                                            
        address: "100 avenue zozo",                                   
        visibility: "public",                                             
        town: "Houston",                                                  
        updated_at: "2019-04-06 16:36:33",                                
        name: "Gravity",                                                  
        logo: "spaces/4dab5e2bf8d8725b05186b9d574f8c98640526d9.png",      
        created_at: "2019-04-06 16:36:33",                                
        zip_code: "111",                                                  
        slug: "gravity",                                                  
        id: 0,                                                            
      },                                                                  
    },                                                                    
  ],   

我想要一个结构,其中我有一个这种格式的配对键值数组:["space.id"=>"role"],如果对于给定的space.id,它们的键是重复的,它应该创建一个像这样的数组['space.id'=>[role1,role2]] .为了解决这个问题,我在 Laravel 集合上使用了 pluck 方法。但是有两个主要问题。 前一个数组的结果保存在$result 变量中。在该变量上,我调用了这样的 pluck 方法:$result->pluck('role','space.id')->all() 然后我得到了这个:

[                             
  850 => "AUTHORS",           
  766 => "ADMINISTRATORS",    
  844 => "ADMINISTRATORS",    
  0 => "ADMINISTRATORS",      
]                             

首先,当我在修补程序中执行此操作时,一切正常。但是当我将结果以 json 格式发送到 front-end 时,space.id 不会出现,这就是如何它照顾ajax call

[                             
      "0" => "AUTHORS",           
      "1" => "ADMINISTRATORS",    
      "2" => "ADMINISTRATORS",    
      "3" => "ADMINISTRATORS",      
    ]   

所以,我不知道为什么原来的space.id 不存在。

第二个问题:如果你仔细查看第一个数组 space.id 850 它重复了两次,对于 CONTRIBUTORSAUTHORS,所以它不支持 duplicate keys 并且它采用了最新的值同样的key 850。但是我想要的是这样的重复键:

[                             
      850 => ["CONTRIBUTORS","AUTHORS"],//Take the 2 instead of only keep the latest value           
      766 => "ADMINISTRATORS",    
      844 => "ADMINISTRATORS",    
      0 => "ADMINISTRATORS",      
    ] 

但我没有任何解决办法。谢谢

【问题讨论】:

  • 对于具有相同 id 的重复值,它似乎使用groupBy id 列..搜索此

标签: php laravel laravel-5


【解决方案1】:

我的答案将依赖于 Laravel 集合,但您可以调整它以在查询级别过滤结果(因为它会更快),但对于小型数据集,使用 php 处理它们就足够了。

请注意,JSON 不允许数组键具有不连续的整数键,因此每个 [id => roles[]] 映射将成为一个对象,您的输出将是:

{
    "850": ["CONTRIBUTORS","AUTHORS"],
    "766": ["ADMINISTRATORS"],
    "844": ["ADMINISTRATORS"],
    "0": ["ADMINISTRATORS"]
}

要将您的查询结果转换为该 json 输出,您必须像这样处理它:

// Query the database
$groups = $u->userGroups()->with('space')->get();

$roles = $groups->groupBy(function ($group) {
    // Group each 'UserGroup' by space.id
    return $group->space->id;
})->map(function ($group) {
    // For each group created, pluck the roles
    return $group->pluck('role');
});

dd($roles->toJson());

注意:如果您的范围是将数据作为 json 返回给调用者,您也可以决定使用 return response()->json($roles) 而不是将其转换为 json 并作为字符串打印。

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多