Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera,
Faz tempo que não venho aqui perguntar nada rs...
Mas me surgiu uma dúvida cruel em relação a como receber os dados de um model.
Eu tenho uma tabela chamada VendorMaster a qual contém todos os meus vendedores, essa tabela se relacionada com uma tabela chamada division que se relaciona com uma chamada listing e por ai vai...
Ai eu tenho o seguinte código:
$resp = VendorMaster::all();
foreach($resp as $key=>$vendor){
$vendor->division;
foreach($vendor->division as $key=>$division) {
$division->listing;
foreach($division->listing as $key=>$listing){
$listing->building;
$listing->building->region;
$listing->building->city;
$listing->building->country;
$listing->building->style;
}
}
}
Bom o que esse código faz?
Ele pega todos os vendedores e faz um loop por seus objetos e coleta dado dos outros models
No caso 1 vendor tem muitas divisions e divisions tem muitos listings
Queria saber se eu fizer dessa forma eu vou tar fazendo um loop exagerado no meu banco (eu acredito que sim...)
Se seria ou não melhor criar uma função no model vendor com joins para fazer exatamente a mesma coisa.
Eu acredito que se eu fizer 1 função única na qual eu faça vendor->getAllDependets ou algo do genero... se vai ser mais rápido e confiável para meu código do que fazer esse loop assim como eu fiz.
Todas as sugestões são bem vindas...
To querendo otimizar as transações para que isso não vire a festa do pau oco nem que leve 3 anos pro banco buscar tudo.
Detalhe eu sei que o aproche atual provavelmente não é o melhor... mas ele funciona rs.
Resultado final desejado é algo assim:
"vendorMasterID": 714,
"vendorMasterName": "asdahsiduasdagd",
"vendorMasterShortName": "asdahsiduasdagd",
"vendorMasterCode": "ASG",
"vendorMasterPosition": 100,
"vendorMasterActive": 1,
"vendorMasterCreated": "2016-12-20 19:38:59",
"vendorMasterAPICode": null,
"division": [{
"vendorDivisionID": 1230,
"vendorDivisionName": "lalalla",
"vendorDivisionVendorID": 714,
"vendorDivisionTypeID": 1,
"vendorDivisionSetPrice": 1,
"vendorDivisionCommission": 0,
"vendorDivisionSetAvail": 0,
"vendorDivisionSetMLOS": 0,
"vendorDivisionSetCustomMLOS": 0,
"vendorDivisionFRS": 0,
"vendorDivisionCurrency": "",
"vendorDivisionNotifyType": "S",
"vendorDivisionEmail": "",
"vendorDivisionFax": "",
"vendorDivisionFaxAlt": "",
"vendorDivisionRateCopy": 0,
"vendorDivisionHideExtranet": 0,
"special_best_daily_rate": 1,
"special_compound_rates": 0,
"set_specials": 0,
"set_charges": 0,
"vendorDivisionActive": 1,
"vendorDivisionCreated": "2016-12-20 12:13:30",
"vendorDivisionSetSimpleRates": "N",
"vendorDivisionBookingURL": null,
"vendorDivisionBookingPhone": null,
"listing": [{
"vendorListingID": 3,
"vendorListingBuildingID": 1026,
"vendorListingUnitTypeID": 1,
"vendorListingDivisionID": 1230,
"vendorListingCheckinID": 7,
"vendorListingGroupID": 0,
"vendorListingExtra": "sdasda",
"vendorListingExtra2": "",
"vendorListingDesc": "dashiduhasio",
"vendorListingOcc": 2,
"vendorListingMaxOcc": 4,
"vendorListingBeds": "King Bed, Queen Bed",
"vendorListingBath": 2,
"vendorListingSqft": 100,
"vendorListingUnit": 0,
"vendorListingStatus": -1,
"vendorListingDecre": 0,
"vendorListingFRS": "",
"vendorListingUnitNum": "",
"vendorListingBlockID": 0,
"vendorListingBlockDays": 0,
"vendorListingPackage": 0,
"vendorListingSecretSaver": 0,
"vendorListingMapListingID": 0,
"vendorListingPrepaid": 0,
"vendorListingActive": 1,
"vendorListingCreated": "2016-12-20 22:38:58",
"vendorListingHousekeepingStatus": 1,
"building": {
"buildingID": 1026,
"buildingName": "El Salvador",
"buildingDesc": "",
"buildingTypeID": 1,
"buildingAddress": "Test",
"buildingRegionID": 201,
"buildingCityID": "91",
"buildingStateID": "664",
"buildingCountryID": "38",
"buildingZipCode": "V5N 2P9",
"buildingCreated": "2016-12-20 20:04:29",
"region": {
"regionID": 201,
"regionName": "Downtown",
"regionAbr": "",
"regionDesc": "",
"regionCityID": 91,
"regionCreated": "2016-12-01 00:10:18"
},
"city": {
"cityID": 91,
"cityStateID": 664,
"cityName": "Vancouver",
"cityDesc": "",
"cityCreatedBy": 0,
"cityCreated": "2016-12-01 00:17:08"
},
"country": {
"countryID": 38,
"countryAbr": "CA",
"countryName": "Canada",
"countryCurrencyID": 0
},
"style": {
"buildingTypeD": 1,
"buildingTypeName": "Hotel",
"buildingTypeActive": 1
}
}
}]
}]
Abraços
Antes de mais nada obrigado pela resposta Williams e feliz natal pra ti ;)
Pois é como eu falei ali em cima.
Eu já utilizo a parte de relacionamento fazendo hasMany e belongs to e assim vai... só dessa maneira eu conseguiria tal loop funcionando rs.
Mas a minha questão é realmente performance... esse é o melhor jeito?
Pq se eu não tivesse utilizando laravel eu teria que fazer um select com joins de todas as tabelas trazendo os dados nulos e checar se os mesmos são nulos ou não para poder fazer tal loop.
Eu tenho pouco contato com o laravel é a primeira vez que utilizo ele num projeto mesmo, antes só utilizei para aprender a mexer nele e tals.
Minha questão realmente é a melhor prática nesse caso.
Se a melhor for relacional já utilizo :D
Obrigado pela opinião ;)
Quem mais tiver opiniões, serão bem vindas!
Igualmente e foi mals ae, não tinha compreendido o primeiro post, ficou meio confuso. No segundo entendi, bom cara se está tudo certo com as FKs, o que vem a otimizar a consulta, é como estás sendo criados os índices no banco, se vai ser desc ou asc nos filtros. Digo que tem gente que cria só as FKs, mas esquece dos índices de otimização.
Pesquise por Tuning + nome do banco que esta sendo usado.
Use relacionamentos do Eloquent
https://laravel.com/docs/5.3/eloquent-relationships
Ou crie um Repositório e faça um Join https://laravel.com/docs/5.3/queries#joins