[英]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-end
, space.id
不會出現,這就是它在ajax call
之后的樣子ajax call
:
[
"0" => "AUTHORS",
"1" => "ADMINISTRATORS",
"2" => "ADMINISTRATORS",
"3" => "ADMINISTRATORS",
]
所以,我不知道為什么原始的space.id
不存在。
問題二:如果你在第一陣列仔細看space.id 850
它reapeted兩次, CONTRIBUTORS
和AUTHORS
,所以它不支持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.