我在我的Laravel應用程序中創建了一個API來提取所有客戶端(3000+)的詳細信息,以便我可以使用我的AngularJS自動填充表單搜索其名稱/地址/電話號碼等。Laravel API - 拉取大量數據(json)
API輸出約1,000Kb的客戶端數據(json)。如果我沒有獲取所有數據,我可以認爲在搜索框中鍵入他的名字時,客戶端不存在,所以我希望能夠加載它們。
一切工作正常,但1,000KB下載是一個緩慢的。 AngularJS雖然處理得好。如果我有10,000個客戶呢?
哪裏應該增加這種性能取:
- Laravel口才查詢,是否有一種方式來獲得在這種情況下在卡盤的數據?
- Php(gzip)減小被拉數據的大小?
- AngularJS在第一行下載後立即工作?
這裏是我使用的代碼:
API控制器
public function index()
{
$clients = Client::where('business_id', '=', \Auth::user()->business_id)->orderBy('updated_at', 'DESC')->get();
return Response::json([
'clients' => $this->transformClientCollection($clients)
], 200);
}
public function transformClientCollection($clients)
{
return array_map([$this, 'transformClient'], $clients->toArray());
}
public function transformClient($clients)
{
return [
'clientid' => $clients['id'],
'first_name' => $clients['first_name'],
'last_name' => $clients['last_name'],
'address_1' => $clients['address_1'],
'address_2' => $clients['address_2'],
'city' => $clients['city'],
'state' => $clients['state'],
'postal_code' => $clients['postal_code'],
'phone_number_1' => $clients['phone_number_1'],
'phone_number_2' => $clients['phone_number_2'],
'email' => $clients['email']
];
}
AngularJS(HTML文件)
<div ng-app="instantsearch">
<div ng-controller="instantSearchCtrl">
<div class="row">
<div class="col-sm-12">
<input type="text" class="form-control search" ng-model="searchString" placeholder="Enter your search terms" />
</div>
</div>
<div class="row data-ctrl" ng-repeat="i in items | filter:searchString | limitTo:20 ">
<div class="col-sm-12">
@{{ i.first_name }} @{{ i.last_name }} @{{ i.address_1 }} @{{ i.address_2 }} @{{ i.city }} @{{ i.state }} @{{ i.phone_number_1 }} @{{ i.phone_number_2 }} @{{ i.email }}
</div>
</div>
</div>
</div>
AngularJS(JS文件)
var app = angular.module('instantsearch',[]);
app.controller('instantSearchCtrl',function($scope,$http,$location){
var urlapiclients = $location.protocol() + "://" + $location.host() + "/api/clients" ;
$http.get(urlapiclients).success(function(data, status, headers, config) {
$scope.items = data.clients;
}).error(function(data, status, headers, config) {
console.log("No data found..");
});
});
app.filter('searchFor', function(){
return function(arr, searchString){
if(!searchString){
return arr;
}
var result = [];
searchString = searchString.toLowerCase();
angular.forEach(arr, function(item){
if(item.first_name.toLowerCase().indexOf(searchString) !== -1){
result.push(item);
}
});
return result;
};
});
JSON輸出
"clients":[
{
"clientid":4981,
"first_name":"Sid",
"last_name":"Hodkiewicz",
"address_1":"6659 Hackett Ways",
"address_2":"",
"city":"New Estherville",
"state":"Tennessee",
"postal_code":"27281-0870",
"phone_number_1":"00700300842",
"phone_number_2":"",
"email":"[email protected]"
},
{
"clientid":4982,
"first_name":"Braulio",
"last_name":"Bechtelar",
"address_1":"7558 Anne Land Suite 876",
"address_2":"",
"city":"Rauview",
"state":"Alabama",
"postal_code":"01837-9601",
"phone_number_1":"1-017-001-8215",
"phone_number_2":"",
"email":"[email protected]"
},
{
"clientid":4983,
"first_name":"Loma",
"last_name":"Dibbert",
"address_1":"805 Jones Fields Suite 411",
"address_2":"",
"city":"Lake Billychester",
"state":"New Jersey",
"postal_code":"69315-4595",
"phone_number_1":"(691)511-6275x891",
"phone_number_2":"",
"email":"[email protected]"
},
{
"clientid":4984,
"first_name":"Verla",
"last_name":"Schulist",
"address_1":"89529 Bode Village Suite 344",
"address_2":"",
"city":"West Jessy",
"state":"Virginia",
"postal_code":"69116",
"phone_number_1":"(248)211-3643",
"phone_number_2":"",
"email":"[email protected]"
},
{
"clientid":4985,
"first_name":"Jimmie",
"last_name":"Fadel",
"address_1":"4355 Marquardt Heights",
"address_2":"",
"city":"South Conrad",
"state":"District of Columbia",
"postal_code":"55751",
"phone_number_1":"(414)901-2495",
"phone_number_2":"",
"email":"[email protected]"
}
您只提取您需要的信息嗎?看起來如果你只是做一個自動完成的,你所需要的只是名字。很難相信你需要3000個客戶端的數據。 – user3158900
我已經在上面添加了我的代碼和輸出的示例。例如,如果我將名稱「address_1」更改爲「a1」,將「phone_number_1」更改爲「p1」,則可能會損失幾個Kb。但除此之外...... – user3489502