Метод извлечения Laravel неправильно форматирует объект - PullRequest
0 голосов
/ 06 апреля 2019

Мне нужно моделировать в 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]] .Toпопытаться устранить проблему, которую я использовал в коллекциях Laravel, используя метод pluck. Но есть 2 основные проблемы.Результат предыдущего массива был сохранен в переменной $result. И для этой переменной я назвал метод pluck следующим образом: $result->pluck('role','space.id')->all(), затем я получил это:

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

First ofвсе, когда я делаю это в тинкере, все идет хорошо. Но когда я помещаю результат в json формат для отправки в front-end, space.id не появляется, и это выглядит после ajax call:

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

Итак, я не знаю, почему нет оригинала space.id.

Вторая проблема: Если вы внимательно посмотрите на первый массив, space.id 850он дважды перезапускается, для 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",      
    ] 

Но у меня нет никакого решения. Спасибо

1 Ответ

0 голосов
/ 08 апреля 2019

Мой ответ будет опираться на коллекции 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 и печати в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...