Do not speak Portuguese? Translate this site with Google or Bing Translator
Laravel Aprenda eloquente

Posted on: July 04, 2021 02:54 PM

Posted by: Renato

Categories: Laravel PHP dev eloquent

Views: 421

Aprenda eloquente

Criar e atualizar


QueryBuilder para inserir um novo registro no banco de dados, por meio do uso da fachada DB:

```php
DB::table('dogs')->insert(['name' => 'Old Yeller', 'age' => 12]);  // result "true"
```

Como mencionamos acima, isso nada mais faz do que executar uma instrução sql para persistir os dados que enviamos na tabela correspondente, recebendo uma resposta booleana que nos diz se sua execução foi bem-sucedida ou não, e pronto, esta instrução irá não adicione timestamps nem faça mais nada por nós, se precisarmos continuar trabalhando com esses dados que enviamos, já que teríamos que fazer uma consulta e trazer o registro, ou trabalhar com as informações brutas conforme o enviamos. Vamos agora tentar com o Eloquent para ver como funciona e se pode nos ajudar nesta tarefa:
```php
$dog = Dog();  // result "App\Models\Dog"
$dog->name = 'Just-right Yeller'; // result "Just-right Yeller"
$dog->age = 6;   // result 6
$dog->save();    // result "true"
```

Neste exemplo, estamos utilizando o método save()fornecido pela eloquent, para isso devemos atribuir os valores a cada propriedade do nosso modelo e executar o método, este atuará da mesma forma que o insertanterior, persistindo o nosso dados, mas com a vantagem de ter uma instância do nosso modelo, o que nos permitirá trabalhar com esse cadastro de uma forma mais confortável, podendo fazer quase tudo com ele. Porém, podemos ver que aqui trabalhamos com uma abordagem meio híbrida, criamos uma instância do modelo, depois estabelecemos os atributos, para finalmente salvá-lo, em linhas gerais poderíamos dizer que foram três etapas executadas, vamos veja uma terceira maneira de salvar nossas informações com menos instruções:
```php
Dog::create(['name' => 'Young Yeller', 'age' => 3]);
```

Este apareceu em nossos rostos exception: "Illuminate \ Database \ Eloquent \ MassAssignmentException com a mensagem 'name'" - MassAssignmentException, do que se trata?

Pois bem, é aqui que entram os nossos amigos $fillablee $guardjogadores. A Eloquent, na sua grande missão de facilitar a gestão da informação desde e para a base de dados, não só nos fornece métodos e propriedades para este particular, também, não dá suporte em termos de protecção na execução destas tarefas, garantindo que apenas os campos que deseja preencher sejam inseridos ou atualizados e nada mais, para isso, em primeiro lugar temos a propriedade $fillable, que é uma espécie de lista branca, na qual indicamos quais são os campos da nossa base de dados que você pode salvar via alocação em massa. Segundo, nós temos$guard que é o oposto, nele indicamos aqueles que queremos proteger e que só podem ser atribuídos diretamente (como no segundo exemplo usando save ()).

Vamos consertar isso e começar. Vamos para o modelo Dog e adicionamos a seguinte linha:
```php
protected $fillable = ['name'];
```

Agora, a partir do tinker, vamos criar um novo recorde:
```php
Dog::create(['name' => 'Young Yeller', 'age' => 3]);
```

Com esta instrução, fizemos o mesmo que no exemplo anterior, exceto por uma exceção, cometemos um erro e não o percebemos. Se verificarmos a nossa base de dados, descobriremos que de facto o nosso amigo Young Yeller está registado, no entanto, embora tenhamos indicado a sua idade no momento do registo, estes dados não persistem, e porquê? Bem, tão simples como isso não contar$fillableo que poderia permitir o mapeamento deste campo. Este é um erro muito comum e que muitas vezes levamos a perceber porque na realidade não existe nenhum sinal de erro que não os indique, por isso poderíamos passar horas quebrando a cabeça procurando o motivo pelo qual nossos dados não persistem, muitos podem acho que isso é uma desvantagem e alguns até tentariam evitar o uso deste método, porém, devemos levar em consideração que este é o caso por um motivo, a 'injeção de SQL', desta forma, embora Qualquer atacante tente e consegue adicionar campos não definidos por nós, estes não afetarão a nossa aplicação uma vez que serão ignorados pelo Eloquent.

A injeção de sql é um tipo de ataque muito comum na web, se você quiser saber um pouco mais sobre isso, pode fazer no link: injeção de SQL

Agora, embora até agora tenhamos visto três maneiras diferentes de salvar nossos dados, ainda existem alguns outros métodos que nos ajudam nesta mesma tarefa, e embora possa parecer opressor ter que aprender tantas opções e como fazer uma coisa, a verdade é que cada um tem um propósito ou ajuda de uma forma diferente, resolvendo diferentes tipos de situações.
Portanto, vemos uma nova maneira de fazer o acima:
```php
$dog = new Dog (['name' => 'Young Yeller', 'age' => 3]); // result App\Models\Dog {#690 name: "Young Yell
```

Como podemos ver, a instrução anterior nada mais faz do que criar uma instância do modelo Dog, mas não persiste nem cria nenhum registro, se quisermos que isso aconteça devemos invocar o método save()de nossa instância.

findOrNew, firstOrNew / firstOrCreate:
Essas três funções são incrivelmente úteis, mas muitos desenvolvedores do Laravel se esquivam delas como algo desconhecido. Não há necessidade de fazer isso; na verdade, agora devemos ter alguma compreensão do que eles fazem.

Nos exemplos anteriores, vimos como, ao fazer uso de, newcriamos apenas uma instância do modelo, nada diferente de uma simples criação de uma instância de php puro $dog = new Dog($data). Por sua vez, Createtambém cria uma instância do modelo com a distinção de que as informações contidas na instância também persistem na base de dados, ou o que se poderia traduzir $dog= (new Dog($data))->save(), neste sentido, podemos dizer que:

o que findOrNew faz é “Encontrar um registro com a chave primária; se o encontrar, ele o retorna e, se não, cria uma instância nova e vazia do modelo.
```php
>>> $dog = Dog::findOrNew(100)
=> App\Models\Dog {#4061}
```

o que firstOrNew faz é “Encontre o primeiro registro que atenda à condição. Se não conseguir encontrar um, ele cria uma nova instância de modelo preenchida com as informações fornecidas sem persistir "

```php

>>> $dog = Dog::firstOrNew(['name' => 'Jock'])
=> App\Models\Dog {#4284
     id: 2,
     name: "Jock",
     gender: "male",
     age: 7,
     created_at: "2021-06-07 02:05:46",
     updated_at: "2021-06-07 02:05:46",
     deleted_at: null,
   }


>>> $dog = Dog::firstOrNew(['name' => 'Champ'])
=> App\Models\Dog {#3333
     name: "Champ",
   }

```

o que firstOrCreate faz é “Encontre o primeiro registro que atenda à condição. Se não conseguir encontrar um, ele cria uma nova instância de modelo preenchida com as informações fornecidas e salva no banco de dados "

```php
>>> $dog = Dog::firstOrCreate(['name' => 'Champ'])
=> App\Models\Dog {#4282
     name: "Champ",
     updated_at: "2021-06-27 15:26:41",
     created_at: "2021-06-27 15:26:41",
     id: 6,
   }
```

```php

>>> Dog::find(6)
=> App\Models\Dog {#4287
     id: 6,
     name: "Champ",
     gender: null,
     age: null,
     created_at: "2021-06-27 15:26:41",
     updated_at: "2021-06-27 15:26:41",
     deleted_at: null,
   }
```   
```

Já os entendemos, no entanto, talvez surja a pergunta: Por que desejaríamos fazer instâncias vazias? Existem alguns motivos, mas um é que quando procuramos por um registro, sempre teremos uma instância de modelo como classe de resultado, mesmo se aquela que queremos não for encontrada, isso significa que podemos escrever nosso código de forma mais consistente e de forma limpa, porque não precisamos mais do que bagunçar muitas condicionais por todo o lugar.

updateOrCreate:
Antes de terminarmos por hoje, vamos dar uma olhada em um último recurso a ser considerado updateOrCreate(). Esta função permite concluir uma busca multiparte com uma instrução de inserção ou atualização dependendo do resultado. Por exemplo:

```php
Dog::updateOrCreate(['id' => 1, 'name' => 'Joe'], ['age' => 15]);
```

Nesse caso, à semelhança dos anteriores, irá procurar um cão cujo id seja igual a 1 e o seu nome seja Joe , ambas as condições são inclusivas, ao encontrar uma correspondência, irá alterar a sua idade para o valor de 15 , no outra mão:
```php
Dog::updateOrCreate(['id' => 2, 'name' => 'Joe'], ['age' => 15]);
```

Como não há correspondência que satisfaça as condições, esta função procederá para criar um novo registro com as informações fornecidas, atribuindo o nome Joe e a idade de 15 anos ao id correspondente ao novo registro. Como podemos ver, isso é útil para coisas como um perfil de usuário, onde não podemos pedir ao usuário para preencher muitas informações ao se inscrever, mas em vez disso, mostramos uma tela de perfil onde eles podem terminar a atualização mais tarde.


1

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (15) Variados (109) PHP (130) Laravel (158) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (27) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (54) devops (25) nodejs (5) npm (2) nvm (1) git (8) firefox (1) react (6) reactnative (5) collections (1) javascript (6) reactjs (7) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (11) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (4) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (1) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (40) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (4) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (2) Architecture (3) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (1) autorizacao (2) authentication (4) authorization (2) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1)

New Articles



Get Latest Updates by Email