簡體   English   中英

Laravel pluck方法不能正確格式化對象

[英]Laravel pluck method doesn't format object correctly

我必須在OneToMany關系模型中進行建模,並且我已經完成了一個ORM查詢,以便在這樣的嵌套結構中得到結果: $u->userGroups()->with('space')->get() and i'我們得到以下結果:

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,                                                            
      },                                                                  
    },                                                                    
  ],   

我想有一個結構,其中我有一個這種格式的paire-key值數組: ["space.id"=>"role"]如果對於給定的space.id它們的鍵是重復的,它應該創建一個像這樣的數組['space.id'=>[role1,role2]] 。試圖解決我在Laravel集合上使用pluck方法的問題。但是有兩個主要問題。 前一個數組的結果保存在$result變量中。在那個變量上我調用了這樣$result->pluck('role','space.id')->all()方法: $result->pluck('role','space.id')->all()然后我得到了這個:

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

首先,當我在修補程序中執行此操作時一切正常。但是當我將結果以json格式發送到front-endspace.id不會出現,這就是它在ajax call之后的樣子ajax call

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

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

問題二:如果你在第一陣列仔細看space.id 850它reapeted兩次, CONTRIBUTORSAUTHORS ,所以它不支持duplicate keys ,它已采取了最新的值相同的key 850 。但我想要重復鍵是這樣的:

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

但我沒有任何解決方案。謝謝

我的答案將依賴於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並打印為字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM