Ir para conteúdo
Entre para seguir isso  
Thiago de Oliveira Cruz

Laravel - Melhores práticas

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

  • Conteúdo Similar

    • Por emersonandree
      <script type="text/javascript"> $(document).ready(function(){ $('#btn_busca_f').click(function () { var data_ini = $('#data_ini').val(); var data_fim = $('#data_fim').val(); var cod_recurso = $('#cod_recurso').val(); var cod_funcionario = $('#cod_funcionario').val(); var num_op = $('#num_op').val(); $.ajax({ type: 'post', async: false, url: '/intranet/ExportaFimApontamento', data:{ '_token': '{{csrf_token()}}', 'data_ini': data_ini, 'data_fim': data_fim, 'cod_recurso': cod_recurso, 'cod_funcionario': cod_funcionario, 'num_op': num_op }, erro: function () { alert('erro'); }, success: function (data) { return (data); alert('Excel Gerado com Sucesso!'); } }); }); }); </script> este script executa uma função no controller onde ele gera um arquivo excel.xls, porem se eu executar a função direto no controler ele funciona, se eu executar com o script ele funciona mas nao gera o arquivo.xls alguem sabe como posso fazer para que ele baixe o arquivo la na função?
    • Por eduardojc
      Boa tarde pessoal, tenho uma tabela que busca os valores no meu MYSQL.

      Tenho um id ( 199917 ) por exemplo. Ele aparece 10x no meu banco de dados

      1 - 199917  data1 peso1
      2 - 199917  data2 peso2
      3 - 199917  data3 peso3
      ..... etc

      Precisaria retornar da seguinte forma minha tabela

      199917  - data1 peso1
                       data2 peso2
                       data3 peso3

      199939  - data1 peso1
                       data2 peso2
                       data3 peso3

      em anexo está as imagens, ficaria grato se puderem ajudar, dei uma pesquisada vi que tem rowspan, mas não faço ideia de como agrupar.

      Tabela 1 como está, tabela 2 como gostaria que ela fica-se

      meu Código:
      <div class="linha"></div> <div class="container"> <table class="table table-striped"> <thead class="thead-dark"> <tr> <th rowspan="1">Brinco</th> <th scope="col">Peso</th> <th scope="col">Data</th> <tr> </thead> @foreach($listagem as $lista) <tbody> <tr> <td rowspan="1">{{$lista->brinco_id }}</td> <td>{{$lista->peso }}</td> <td>{{ \Carbon\Carbon::parse($lista->data)->format('d/m/Y') }}</td> </tr> </tbody> @endforeach </table> </div>

    • Por antonio_milat
      Meu listener está sendo chamado duas vezes, mas o evento só é disparado uma vez.
      Eu copiei a base do código da documentação do Lumen 5.7 e aparentemente está tudo configurado corretamente. Não consigo encontrar o problema.
       
      bootstrap/app.php
      $app->register(App\Providers\EventServiceProvider::class);  
      app/Providers/EventServiceProvider.php
      protected $listen = [ 'App\Events\NewAuthEvent' => [ 'App\Listeners\SendNewAuthListener', ], ];  
      app/Events/NewAuthEvent.php
      use Illuminate\Queue\SerializesModels; use App\Data\Entity\User; use App\Data\Entity\Authorization; use Illuminate\Support\Facades\Log; class NewAuthEvent { use SerializesModels; public $user; public $auth; public function __construct(User $user, Authorization $auth) { Log::debug("Disparado uma vez"); $this->user = $user; $this->auth = $auth; } }  
      app/Listeners/SendNewAuthListener.php
      use App\Events\NewAuthEvent; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use App\Data\Service\MessengerService; use Illuminate\Support\Facades\Log; class SendNewAuthListener { private $messenger; public function __construct(MessengerService $messenger) { Log::debug("Chamado duas vezes"); $this->messenger = $messenger; } public function handle(NewAuthEvent $event) { Log::debug("Chamado duas vezes também"); $this->messenger->new($event->user, $event->auth); } }  
      Disparando o evento:
      event(new NewAuthEvent($objUser, $objAuthorization)); Estou me esquecendo de algum parâmetro ou configuração? Agradeço desde já!
    • Por bobzznnn
      Preciso de um script que converta o saldo atual do meu website em bitcoin. Assim que eu possa colocar de forma que esteja junto ao "Valor" da conta.
      O Script que puxa o valor é esse:
       
      <div class="row">
          <div class="col-md-3 col-sm-6 col-xs-12">
              <div class="info-box">
                  <span class="info-box-icon bg-aqua"><i class="fa fa-usd"></i></span>
                  <div class="info-box-content">
                      <span class="info-box-text">MEU SALDO</span>
                      <span class="info-box-number">U$ <?php
                                      $saldo = Auth::user()->saldo;
                                      echo e(number_format($saldo, 2, '.', ','));
                                      ?></span>
                  </div>
                  
              </div>
          </div>
       

    • Por Air-Gear
      Olá a todos!
       
      Eu comecei mexer com Laravel hoje e até conseguir criar um novo projeto, mas eu preciso abrir e rodar um projeto existente e não estou conseguindo. Ele pede o arquivo autoload.php que não está no projeto. Eu já instalei o Banco de Dados desse projeto sem problemas. Eu instalei o Composer, mas não coloquei a URL de referência. Eu uso o Wamp Server 3.0.6, com Apache 2.4.23, PHP 5.6.25 e MySQL 5.7.14.
       
      Eu preciso instalar mais alguma coisa? Esqueci de fazer alguma configuração? Por favor, preciso de ajuda.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.